Gestion du contexte dans des hooks

ViPHP
ViPHP | 928 Messages

27 mai 2008, 16:06

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 !

ViPHP
ViPHP | 4674 Messages

27 mai 2008, 23:28

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

28 mai 2008, 00:48

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…

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

28 mai 2008, 01:19

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).

ViPHP
ViPHP | 928 Messages

28 mai 2008, 20:14

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.

ViPHP
ViPHP | 4674 Messages

28 mai 2008, 20:23

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 51 Messages

28 mai 2008, 21:28

juste une question de nul typique:

C'est quoi un hook :?: :!:
La bave du crapaud n'atteinds pas la blanche colombe.
Site principal: CiaoNetwork
http://blog.ciaonetwork.com

Administrateur PHPfrance
Administrateur PHPfrance | 449 Messages

28 mai 2008, 21:52

un hook c'est un crochet tu as jamais vu peter pan en VO ? :p
Cordialement
Saeveas

http://saeveas.labrute.fr

ViPHP
ViPHP | 4674 Messages

28 mai 2008, 21:55

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.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 51 Messages

28 mai 2008, 21:56

un hook c'est un crochet tu as jamais vu peter pan en VO ? :p
Ah bon.

Et en PHP, ça sert à quoi :?:
La bave du crapaud n'atteinds pas la blanche colombe.
Site principal: CiaoNetwork
http://blog.ciaonetwork.com

Mammouth du PHP | 983 Messages

28 mai 2008, 22:37

Ca sert à intercaler son propre code dans une librairie, framework, etc. afin de faire un traitement spécial sans avoir à toucher à la librairie ;)

Mammouth du PHP | 1511 Messages

28 mai 2008, 23:25

Une sorte de callback nan ?

Eléphant du PHP | 185 Messages

29 mai 2008, 00:11

Peut-être récupérer les variables définies avec avec debug_backtrace() ?
Moi, bourrin ? :roll: