Flujo de ejecución
1Presentación
Es posible solicitar la ejecución de plugins, antes y/o después de la ejecución de los controladores de la aplicación. Técnicamente, los plugins son controladores con métodos especiales, que pueden modificar la petición antes de pasarla al siguiente plugin o al controlador designado. Puedes encadenar plugins antes del controlador, y otros plugins después.
Los archivos fuente de los plugins se guardan en el directorio controllers de la aplicación.
Un mismo objeto puede tener a la vez el rol de plugin y de controlador.
2Control de la ejecución
La cadena de ejecución de Temma tiene 3 fases principales:
- Los pre-plugins se ejecutan uno tras otro.
-
En el controlador:
- Se ejecuta el método de inicialización __wakeup().
-
Se ejecuta la acción. Puede ser:
- La acción proxy __invoke(), si está definida.
- La acción solicitada según la URL, si está definida.
- La acción por defecto __call(), si está definida.
- Se ejecuta el método de finalización __sleep().
- Los post-plugins se ejecutan uno tras otro.
Cada uno de estos métodos puede influir en el flujo de ejecución. Por defecto, si no devuelven nada (o si devuelven null o self::EXEC_FORWARD, ver más abajo), la ejecución continúa con el siguiente paso. En caso contrario, pueden devolver valores diferentes, para influir en el flujo de ejecución retrocediendo o saltándose pasos.
Aquí tienes un diagrama resumen, con los distintos flujos de ejecución posibles:

2.1EXEC_FORWARD
Pasa al siguiente paso de la cadena de ejecución.
El método debe devolver:
// sin retornoreturn null;return self::EXEC_FORWARD;return \Temma\Web\Controller::EXEC_FORWARD;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowForward();
2.2EXEC_STOP
Detiene la ejecución de la fase actual (pre-plugins, controlador o post-plugins):
- Por un pre-plugin: no se ejecutará ningún otro pre-plugin y se pasará directamente a la fase del controlador.
- Por el método de inicialización del controlador: no se ejecutará ni la acción ni el método de finalización, y se pasará directamente a la fase de los post-plugins.
- Por la acción del controlador: el método de finalización no se ejecutará y se pasará directamente a la fase de los post-plugins.
- Por el método de finalización del controlador: se pasará a la fase de los post-plugins (igual que con EXEC_FORWARD).
- Por un post-plugin: no se ejecutará ningún otro post-plugin.
El método debe devolver:
return self::EXEC_STOP;return \Temma\Web\Controller::EXEC_STOP;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowStop();
2.3EXEC_HALT
Detiene toda la cadena de ejecución y pasa directamente a la vista.
- Por un pre-plugin: no se ejecutará ningún otro pre-plugin, ni la fase del controlador, ni la fase de los post-plugins.
- Por el método de inicialización del controlador: no se ejecutará ni la acción ni el método de finalización, ni tampoco la fase de los post-plugins.
- Por la acción del controlador: no se ejecutará el método de finalización, ni tampoco la fase de los post-plugins.
- Por el método de finalización del controlador: no se ejecutará la fase de los post-plugins.
- Por un post-plugin: no se ejecutará ningún otro post-plugin.
El método debe devolver:
return self::EXEC_HALT;return \Temma\Web\Controller::EXEC_HALT;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowHalt();
2.4EXEC_RESTART
Reinicia el procesamiento de la fase actual (pre-plugins, controlador o post-plugins).
- Por un pre-plugin: se ejecutará de nuevo toda la cadena de pre-plugins.
- Por el método de inicialización del controlador: el método de inicialización se ejecutará de nuevo.
- Por la acción del controlador: el método de inicialización se ejecutará de nuevo.
- Por el método de finalización del controlador: el método de inicialización se ejecutará de nuevo.
- Por un post-plugin: se ejecutará de nuevo toda la cadena de post-plugins.
El método debe devolver:
return self::EXEC_RESTART;return \Temma\Web\Controller::EXEC_RESTART;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowRestart();
2.5EXEC_REBOOT
Reinicia toda la cadena de procesamiento (pre-plugins + controlador + post-plugins). Sea cual sea el punto, la ejecución se reanuda desde el primer pre-plugin y se desarrolla de nuevo.
El método debe devolver:
return self::EXEC_REBOOT;return \Temma\Web\Controller::EXEC_REBOOT;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowReboot();
2.6EXEC_QUIT
Detiene la ejecución del framework. Desde un plugin o un controlador, esto interrumpe todo el procesamiento; no se ejecutará ni ningún otro plugin ni el controlador. A diferencia de EXEC_HALT, la vista no se ejecutará y las peticiones de redirección se ignoran.
El método debe devolver:
return self::EXEC_QUIT;return \Temma\Web\Controller::EXEC_QUIT;
También es posible lanzar una excepción (en la acción o en una función llamada por ella):
throw new \Temma\Exceptions\FlowQuit();