Page 1 sur 1

Gestion du contexte dans des hooks

Posté : 27 mai 2008, 16:06
par Genova
Bonjour,
j'aimerai pouvoir implémenter un système de hook dans l'application sur laquelle je bosse, c'est à dire poser à certains points clefs du programme une méthode
$hook->trigger('nom_du_point_clef');
qui irai me chercher des codes externs situés dans un dossier nom_du_point_clef et me les exécuter (eval ou include, à voir).

J'aimerai que ces codes externes puissent avoir accès au contexte de la fonction dans laquelle j'appel mon hook, est ce possible de gérer cela ?

Exemple (index.php)
function header()
{
   $mavariable = 42;

   $hook->trigger('header');
}
ensuite j'aurai un fichier hookheader.php inclus, et dans ce fichier je veux accéder à $mavariable. Est ce possible d'une façon ou d'une autre, ou est ce que je devrais ruser à coup de globale ?

Merci pour la réponse !

Posté : 27 mai 2008, 23:28
par Hywan
Hey :),

Normalement, avec un include basique ça devrait fonctionner. Il faut que $hook->trigger inclue le fichier et si tu utilises tes variables — précédemment définies — dans ce fichier, alors il n'y a pas de soucis (voir le manuel, le premier exemple illustre cette idée).

Peut-être qu'un bon système de plugin serait plus pertinent (même si ça y ressemble beaucoup) :-k.

Posté : 28 mai 2008, 00:48
par Sékiltoyai
Euh non, si les variables sont locales à la fonction header, elles ne seront pas visibles dans la méthode trigger et donc, le cas échéant, dans tout fichier, inclu dans la méthode trigger.
Et je ne pense pas que ce soit réglable facilement…

Posté : 28 mai 2008, 01:19
par naholyr
Pour moi le mieux est de passer ton contexte sous forme de tableau associatif dans ta fonction trigger. À l'aide de compact() et extract() ça donne des choses pas trop lourdes et ça marche comme tu l'entendais.
function header() 
{ 
   $mavariable = 42; 

   $hook->trigger('header', compact('mavariable'));
}
Et
class Hook {
  //...
  public function trigger($event, $context = array()) {
    extract($context);
    include 'event.' . $event . '.php';
  }
}
Note : les includes pour du code, c'est très mal :( autant utiliser des fonctions, genre la fonction event_nom-du-hook($context).

Posté : 28 mai 2008, 20:14
par Genova
Merci pour les réponses,
ce que tu proposes naholyr est ce qui se rapprocherait le plus de ce que je recherche, malheureusement je ne peux pas me permettre de passer les variables en paramètres, je préfère à la limite utiliser le mot clef "global" dans la fonction que l'utilisateur aura définit. J'ai pas mal éplucher la documentation et je ne vois pas de moyens pour déplacer le contexte malheureusement, je vais donc me contenter de globaliser les variables dont j'aurai besoin.

@HyWaN : un système de hook est un outil parmi plusieurs autres pour une bonne gestion de plugins je pense.

Posté : 28 mai 2008, 20:23
par Hywan
Attention. Je pense que tu le sais très bien mais les globals sont assez dangereuses. Alors gaffe :).

Sékil a posé un bon problème. Les variables sont locales à la fonction. Soit. N'utilise pas de fonction mais ne travaille qu'avec des fichiers (en gros : une fonction = un fichier). C'est encore une autre solution.

Posté : 28 mai 2008, 21:28
par docdamien
juste une question de nul typique:

C'est quoi un hook :?: :!:

Posté : 28 mai 2008, 21:52
par SAEVEAS
un hook c'est un crochet tu as jamais vu peter pan en VO ? :p

Posté : 28 mai 2008, 21:55
par Hywan
Question d'un débutant dans le nullissisme , réponse d'un maître dans le nullissisme … ^^

Hook veut dire hameçon ou crochet. En gros, tu le places dans ton code, et l'utilisateur peut s'y « accrocher » pour exécuter un code. C'est une base de plugin en gros.

Voir : Hook (informatique), sur Wikipédia.

Posté : 28 mai 2008, 21:56
par docdamien
un hook c'est un crochet tu as jamais vu peter pan en VO ? :p
Ah bon.

Et en PHP, ça sert à quoi :?:

Posté : 28 mai 2008, 22:37
par rami
Ca sert à intercaler son propre code dans une librairie, framework, etc. afin de faire un traitement spécial sans avoir à toucher à la librairie ;)

Posté : 28 mai 2008, 23:25
par momox
Une sorte de callback nan ?

Posté : 29 mai 2008, 00:11
par savageman
Peut-être récupérer les variables définies avec avec debug_backtrace() ?
Moi, bourrin ? :roll: