Eventos

Nota

El módulo Eventos utiliza la clase estática EventsManager para gestionar los eventos.

Eventos principales del marco

Ubiquity emite eventos durante las diferentes fases del envío de una solicitud.
Estos eventos son relativamente pocos, para limitar su impacto en el rendimiento.

Parte

Nombre del evento

Parámetros

Ocurren cuando

ViewEvents

BEFORE_RENDER

viewname, parameters

Antes de renderizar una vista

ViewEvents

AFTER_RENDER

viewname, parameters

Después de renderizar una vista

DAOEvents

GET_ALL

objects, classname

Después de cargar varios objetos

DAOEvents

GET_ONE

object, classname

Después de cargar un objeto

DAOEvents

BEFORE_UPDATE

instance

Antes de actualizar un objeto

DAOEvents

AFTER_UPDATE

instance, result

Después de actualizar un objeto

DAOEvents

BEFORE_INSERT

instance

Antes de insertar un objeto

DAOEvents

AFTER_INSERT

instance, result

Después de insertar un objeto

RestEvents

BEFORE_INSERT

instance

Antes de insertar un objeto

RestEvents

BEFORE_UPDATE

instance

Antes de actualizar un objeto

Nota

No hay eventos BeforeAction y AfterAction, ya que los métodos initialize y finalize de la clase del controlador realizan esta operación.

Escuchar un evento

Example 1 :

Añadir una propiedad _updated en las instancias modificadas en la base de datos :

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     });

Nota

Los parámetros que se pasan a la función callback varían según el evento que se esté escuchando.

Example 2 :

Modificación de la representación de la vista

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     });

Crear tus propios eventos

Example :

Crear un evento para contar y almacenar el número de visualizaciones por acción :

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     }

Registro de eventos

Registrando el evento TracePageEventListener en 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);

Disparo de eventos

Un evento puede ser disparado desde cualquier lugar, pero tiene más sentido hacerlo aquí en el método initialize del controlador 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     }

El resultado en 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
     );

Eventos registro optimización

Es preferible almacenar en caché el registro de los listeners, para optimizar su tiempo de carga :

Crear un script de cliente, o una acción de controlador (no accesible en modo de producción) :

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();
}

Después de la ejecución, el archivo de caché se genera en app/cache/events/events.cache.php.

Una vez creada la caché, el archivo services.php sólo necesita tener la línea :

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