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