Le système d’évènements de Symfony est une avancée particulièrement intéressante dans le framework. Toutefois, la documentation officielle est un peu spartiate sur le domaine. Voici donc un exemple pratique plus didactique pour utiliser les évènements.
Le système d’évènement de Symfony est basé sur le motif de programmation observer qui est un grand classique du genre.
Tout d’abord, il faut enregistrer le listener. On peut le faire à peu près n’importe ou, par exemple dans le preExecute du code d’un contrôleur, ou plus globalement dans le fichier config/ProjectConfiguration.class.php qui va gérer la configuration globale de votre projet.
class ProjectConfiguration extends sfProjectConfiguration
{
public function setup()
{
// listener
if (!sfConfig::get('already_event_connected', false))
{
$this->getEventDispatcher()->connect('a.name', 'aclass::dosomething');
sfConfig::set('already_event_connected', true);
}
}
}
Ce code vous assure que le listener sera enregistré une unique fois. En effet, si il est enregistré deux fois, a chaque notification il sera exécuté deux fois ….
Ensuite, n’importe ou dans votre code, vous pouvez « lancer » cet évènement. Par exemple, dans le code d’un contrôleur.
// notification
sfContext::getInstance()->getEventDispatcher()->notify(new sfEvent(get_class($this), 'a.name',
array(
'a_var' => $foo,
'another_var' => $bar,
)));
La fonction de callback, ici une méthode statique, récupère un objet sfEvent en paramètre. Via ce dernier, on a également accès aux variables passées lors de la notification de l’évènement.
// dans la classe aclass
public static function dosomething (sfEvent $event)
{
$foo = $event['a_var'];
$bar = $event['another_var'];
// code
}
Et voilà, à vous de jouer.