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:

  1. Los pre-plugins se ejecutan uno tras otro.
  2. En el controlador:
    1. Se ejecuta el método de inicialización __wakeup().
    2. 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.
    3. Se ejecuta el método de finalización __sleep().
  3. 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 retorno
  • return 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();