Evènements

Note

Le module Events utilise la classe statique EventsManager pour gérer les évènements.

Framework core events

Ubiquity émet des événements lors des différentes phases de soumission d’une requête.
Ces événements sont relativement peu nombreux, afin de limiter leur impact sur les performances.

Partie

Nom d’évènement

Paramètres

Se produit quand

ViewEvents

BEFORE_RENDER

viewname, parameters

Avant d’afficher une vue

ViewEvents

AFTER_RENDER

viewname, parameters

Après l’affichage d’une vue

DAOEvents

GET_ALL

objects, classname

Après le chargement d’un ensemble d’objets

DAOEvents

GET_ONE

object, classname

Après le chargement d’un objet

DAOEvents

BEFORE_UPDATE

instance

Avant la mise à jour d’un objet

DAOEvents

AFTER_UPDATE

instance, result

Après mise à jour d’un objet

DAOEvents

BEFORE_INSERT

instance

Avant l’insertion d’un objet

DAOEvents

AFTER_INSERT

instance, result

Après l’insertion d’un objet

RestEvents

BEFORE_INSERT

instance

Avant l’insertion d’un objet

RestEvents

BEFORE_UPDATE

instance

Avant la mise à jour d’un objet

Note

Il n’y a pas d’événement BeforeAction et AfterAction, puisque les méthodes initialize et finalize de la classe contrôleur effectuent ces opérations.

Ecouter un évènement

Exemple 1 :

Ajout d’une propriété _updated sur les instances modifiées dans la base de données :

app/config/services.php
 1use Ubiquity\events\EventsManager;
 2use Ubiquity\events\DAOEvents;
 3
 4...
 5
 6     EventsManager::addListener(DAOEvents::AFTER_UPDATE, function($instance,$result){
 7             if($result==1){
 8                     $instance->_updated=true;
 9             }
10     });

Note

Les paramètres passés à la fonction de callback varient en fonction de l’évènement écouté.

Exemple 2 :

Modification de l’affichage de la vue

app/config/services.php
1use Ubiquity\events\EventsManager;
2use Ubiquity\events\ViewEvents;
3
4...
5
6     EventsManager::addListener(ViewEvents::AFTER_RENDER,function(&$render,$viewname,$datas){
7             $render='<h1>'.$viewname.'</h1>'.$render;
8     });

Créer ses propres évènements

Exemple :

Création d’un évènement pour compter et mémoriser le nombre d’affichages par action :

app/eventListener/TracePageEventListener.php
 1     namespace eventListener;
 2
 3     use Ubiquity\events\EventListenerInterface;
 4     use Ubiquity\utils\base\UArray;
 5
 6     class TracePageEventListener implements EventListenerInterface {
 7             const EVENT_NAME = 'tracePage';
 8
 9             public function on(&...$params) {
10                     $filename = \ROOT . \DS . 'config\stats.php';
11                     $stats = [ ];
12                     if (file_exists ( $filename )) {
13                             $stats = include $filename;
14                     }
15                     $page = $params [0] . '::' . $params [1];
16                     $value = $stats [$page] ?? 0;
17                     $value ++;
18                     $stats [$page] = $value;
19                     UArray::save ( $stats, $filename );
20             }
21     }

Enregistrement d’évènements

Enregistrement de l’évènement TracePageEventListener dans services.php :

app/config/services.php
1     use Ubiquity\events\EventsManager;
2     use eventListener\TracePageEventListener;
3
4     ...
5
6     EventsManager::addListener(TracePageEventListener::EVENT_NAME, TracePageEventListener::class);

Déclencher des évènements

Un évènement peut être déclenché depuis n’importe quel contexte, mais il est plus logique de le faire depuis la méthode initialize du contrôleur de base.

app/controllers/ControllerBase.php
 1     namespace controllers;
 2
 3     use Ubiquity\controllers\Controller;
 4     use Ubiquity\utils\http\URequest;
 5     use Ubiquity\events\EventsManager;
 6     use eventListener\TracePageEventListener;
 7     use Ubiquity\controllers\Startup;
 8
 9     /**
10      * ControllerBase.
11      **/
12     abstract class ControllerBase extends Controller{
13             protected $headerView = "@activeTheme/main/vHeader.html";
14             protected $footerView = "@activeTheme/main/vFooter.html";
15             public function initialize() {
16                     $controller=Startup::getController();
17                     $action=Startup::getAction();
18                     EventsManager::trigger(TracePageEventListener::EVENT_NAME, $controller,$action);
19                     if (! URequest::isAjax ()) {
20                             $this->loadView ( $this->headerView );
21                     }
22             }
23             public function finalize() {
24                     if (! URequest::isAjax ()) {
25                             $this->loadView ( $this->footerView );
26                     }
27             }
28     }

Le résultat dans app/config/stats.php :

app/config/stats.php
return array(
             "controllers\\IndexController::index"=>5,
             "controllers\\IndexController::ct"=>1,
             "controllers\\NewController::index"=>1,
             "controllers\\TestUCookieController::index"=>1
     );

Optimisation de l’enregistrement d’évènements

Il est préférable de mettre en cache l’enregistrement des écouteurs, afin d’optimiser leur temps de chargement :

Créer un script client, ou une action contrôleur (non accessible en mode production) :

use Ubiquity\events\EventsManager;

public function initEvents(){
        EventsManager::start();
        EventsManager::addListener(DAOEvents::AFTER_UPDATE, function($instance,$result){
                if($result==1){
                        $instance->_updated=true;
                }
        });
        EventsManager::addListener(TracePageEventListener::EVENT_NAME, TracePageEventListener::class);
        EventsManager::store();
}

Après exécution, le cache est généré dans le fichier app/cache/events/events.cache.php.

Une fois le cache généré, le fichier services.php doit juste inclure cette ligne :

\Ubiquity\events\EventsManager::start();