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:
- Os pré-plugins são executados um após o outro.
-
No controlador:
- O método de inicialização __wakeup() é executado.
-
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.
- O método de finalização __sleep() é executado.
- 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 retornoreturn 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();