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 :
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
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 :
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
:
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.
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 :
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();