Dans ce chapitre, nous nous intéressons aux listeners de connexion, c'est-à-dire les listeners que l'on peut attacher à la classe
Doctrine_Connection.
Je vous l'ai dit dans le chapitre précédent, un listener est une classe qui implémente des méthodes spécifiques.
Créer un listener
Il existe trois manières de créer un listener.
Étendre une classe de base
Nous appellerons notre listener fictif
CustomListener.
Doctrine_EventListener offrant une base pour tout listener, le nôtre en héritera donc :
Code : PHP | <?php
class CustomListener extends Doctrine_EventListener
{ }
|
Ouvrez le fichier
~/lib/vendor/doctrine/Doctrine/EventListener.php. Vous devriez maintenant mieux comprendre l'astuce des
méthodes vides que je vous avais expliquée. La seule chose qu'il vous reste à faire maintenant, c'est de surcharger les méthodes que vous voulez implémenter. Chaque méthode porte un nom assez explicite, et je pense que vous devriez vous y retrouver.
Étendre une autre classe
Si, pour une raison quelconque, votre listener
ne peut pas hériter de
Doctrine_EventListener (parce qu'il hérite déjà d'une autre classe, par exemple), il va falloir écrire en dur chaque méthode.
Explications
La seule condition pour créer un listener, c'est en fait qu'il
implémente l'interface Doctrine_EventListener_Interface. Comme vous avez pu le voir en ouvrant le fichier
EventListener.php, la seule chose que fait la classe
Doctrine_EventListener est d'implémenter cette interface. Elle définit toutes les méthodes. Ainsi, la classe fille (
CustomListener) implémente indirectement cette même interface, tout en n'étant pas obligée de redéfinir toutes les méthodes.
Donc, si vous n'utilisez pas toutes les méthodes dans votre listener, vous devrez quand même les définir !
Un exemple de code sera certainement plus parlant :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
class CustomListener2 extends UneAutreClasse implements Doctrine_EventListener_Interface
{
public function preTransactionCommit(Doctrine_Event $event)
{ }
public function postTransactionCommit(Doctrine_Event $event)
{ }
// Et ainsi de suite avec toutes les méthodes imposées par l'interface...
}
|
Bien sûr, c'est ici que vous personnalisez chaque méthode comme vous le voulez.
Le « faux » listener...
La dernière manière de créer un listener, est d'implémenter l'interface
Doctrine_Overloadable. Cette interface n'impose qu'une chose : l'implémentation de la méthode magique
__call().
Cette méthode sera appelée lors de chaque évènement, à vous ensuite de traiter tout ça comme vous le voulez.
Pour rappel, la méthode __call() reçoit deux paramètres : le nom de la méthode appelée, et un tableau des arguments.
Code : PHP | <?php
class CustomListener3 implements Doctrine_Overloadable
{
public function __call($method, $arguments)
{
$event = $arguments[0];
}
}
|
Attacher un listener
La dernière chose à savoir, c'est comment
lier le listener à l'objet écouté.
Ceci se fait d'une manière très simple :
Doctrine_Connection possède la méthode
addListener() qui prend en paramètre... un listener !
Un exemple est plus simple que de longues explications :
Code : PHP | <?php
$listener1 = new CustomListener();
$listener2 = new CustomListener2();
$connexion->addListener($listener1);
$connexion->addListener($listener2);
|
Comme vous le voyez, il est possible d'ajouter plusieurs listeners. Lors d'un évènement, ils seront appelés dans le même ordre que celui dans lequel ils ont été affectés.
Notez que s'il n'y a qu'un seul listener, vous pouvez utiliser la méthode setListener(). Cela supprime également d'éventuels listeners existants.
Les listeners attachés à
Doctrine_Connection écoutent également les classes proches, comme
Doctrine_Transaction et
Doctrine_Connection_Statement. Néanmoins, le listener est global à ces trois classes, et doit être attaché à
Doctrine_Connection.
Je vous invite à vous référer à
la documentation officielle (
in english of course
) pour avoir le détail de chaque méthode.
Dans les tableaux, la colonne de gauche indique le nom de la méthode du listener, celle du milieu indique quelle méthode est écoutée, et la troisième contient d'éventuels paramètres accessibles de l'objet
Doctrine_Event.
Par exemple, lors de l'appel de
Doctrine_Connection::connect(), avant toute action, la méthode
preConnect() du/des listener(s) est appelée. Une fois que toutes les actions sont effectuées, c'est au tour de la méthode
postConnect().
Je vous rappelle aussi que toutes les méthodes reçoivent un objet
Doctrine_Event en paramètre.
Je ne m'attarde pas plus sur les listeners de connexion, ça ne vous sera pas forcément utile pour une utilisation basique.