Fluxo de execução


1Apresentação

É possível solicitar a execução de plugins, antes e/ou depois da execução dos controladores da aplicação. Tecnicamente, os plugins são controladores com métodos especiais, que podem modificar a requisição antes de repassá-la ao próximo plugin ou ao controlador designado. Você pode encadear plugins antes do controlador, e outros plugins depois.

Os arquivos-fonte dos plugins ficam armazenados no diretório controllers da aplicação.

O mesmo objeto pode desempenhar tanto o papel de plugin quanto de controlador.


2Controle de execução

A cadeia de execução do Temma tem 3 fases principais:

  1. Os pré-plugins são executados um após o outro.
  2. No controlador:
    1. O método de inicialização __wakeup() é executado.
    2. A ação é executada. Ela pode ser:
      • A ação proxy __invoke(), se definida.
      • A ação solicitada de acordo com a URL, se definida.
      • A ação padrão __call(), se definida.
    3. O método de finalização __sleep() é executado.
  3. Os pós-plugins são executados um após o outro.

Cada um desses métodos pode influenciar o fluxo de execução. Por padrão, se eles não retornarem nada (ou se retornarem null ou self::EXEC_FORWARD, veja abaixo), a execução segue para a etapa seguinte. Caso contrário, eles podem retornar valores diferentes, para influenciar o fluxo de execução voltando atrás ou pulando etapas.

Aqui está um diagrama-resumo, com os diferentes fluxos de execução possíveis:


2.1EXEC_FORWARD

Avança para a próxima etapa da cadeia de execução.

O método deve retornar:

  • // sem retorno
  • return null;
  • return self::EXEC_FORWARD;
  • return \Temma\Web\Controller::EXEC_FORWARD;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowForward();

2.2EXEC_STOP

Interrompe a execução da fase atual (pré-plugins, controlador ou pós-plugins):

  • Por um pré-plugin: nenhum outro pré-plugin será executado e iremos diretamente para a fase do controlador.
  • Pelo método de inicialização do controlador: nem a ação nem o método de finalização serão executados, e iremos diretamente para a fase dos pós-plugins.
  • Pela ação do controlador: o método de finalização não será executado e iremos diretamente para a fase dos pós-plugins.
  • Pelo método de finalização do controlador: iremos para a fase dos pós-plugins (como em EXEC_FORWARD).
  • Por um pós-plugin: nenhum outro pós-plugin será executado.

O método deve retornar:

  • return self::EXEC_STOP;
  • return \Temma\Web\Controller::EXEC_STOP;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowStop();

2.3EXEC_HALT

Interrompe toda a cadeia de execução e vai diretamente para a visão.

  • Por um pré-plugin: nenhum outro pré-plugin será executado, nem a fase do controlador, nem a fase dos pós-plugins.
  • Pelo método de inicialização do controlador: nem a ação nem o método de finalização serão executados, assim como a fase dos pós-plugins.
  • Pela ação do controlador: o método de finalização não será executado, assim como a fase dos pós-plugins.
  • Pelo método de finalização do controlador: a fase dos pós-plugins não será executada.
  • Por um pós-plugin: nenhum outro pós-plugin será executado.

O método deve retornar:

  • return self::EXEC_HALT;
  • return \Temma\Web\Controller::EXEC_HALT;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowHalt();

2.4EXEC_RESTART

Reinicia o processamento da fase atual (pré-plugins, controlador ou pós-plugins).

  • Por um pré-plugin: toda a cadeia de pré-plugins será executada novamente.
  • Pelo método de inicialização do controlador: o método de inicialização será executado novamente.
  • Pela ação do controlador: o método de inicialização será executado novamente.
  • Pelo método de finalização do controlador: o método de inicialização será executado novamente.
  • Por um pós-plugin: toda a cadeia de pós-plugins será executada novamente.

O método deve retornar:

  • return self::EXEC_RESTART;
  • return \Temma\Web\Controller::EXEC_RESTART;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowRestart();

2.5EXEC_REBOOT

Reinicia toda a cadeia de processamento (pré-plugins + controlador + pós-plugins). Independentemente do ponto em que estiver, a execução é retomada a partir do primeiro pré-plugin, percorrendo novamente toda a cadeia.

O método deve retornar:

  • return self::EXEC_REBOOT;
  • return \Temma\Web\Controller::EXEC_REBOOT;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowReboot();

2.6EXEC_QUIT

Interrompe a execução do framework. A partir de um plugin ou de um controlador, isso interrompe todo o processamento; nem outros plugins, nem o controlador, serão executados. Diferentemente de EXEC_HALT, a visão não será executada e as solicitações de redirecionamento são ignoradas.

O método deve retornar:

  • return self::EXEC_QUIT;
  • return \Temma\Web\Controller::EXEC_QUIT;

Também é possível lançar uma exceção (na ação ou em uma função chamada por ela):

throw new \Temma\Exceptions\FlowQuit();