Uma arquitetura de plugins php
Estou tentando pensar em uma maneira de criar uma arquitetura de plug-in para o meu próprio framework. Eu li vários tópicos e postei aqui e em outros sites. E basicamente eu vim para a seguinte solução, que parece ser a única boa opção no PHP (atualmente).
A ideia é que cada classe estenda um tipo de observador como classe. Portanto, uma classe Template, BaseController, etc., sempre estende uma classe Plugin.
<code>class BaseController extends Plugin { public function __construct() { // Plugin check, notify all loaded plugins $this->checkForEarlyHooks(); // Init some standard stuff $this->view = new Template(); $this->baseLayout = 'layout.html'; $this->something = new Something(); // Plugin check, notify all loaded plugins $this->checkForLateHooks(); } } </code>
Então, o que basicamente acontece aqui é que quando um indexController estende um baseController, uma verificação de plugin é feita. Neste caso, para o construtor. Isso pode ser conveniente quando você deseja fazer algum tipo de verificação de login com um plug-in, antes que um método Action seja invocado.
A classe Plugin pode resolver de qual classe é chamada e sabe quais funções procurar nos plugins carregados.
Observe também que ele verifica a lista de plugins carregados 2 vezes. Um antes de qualquer coisa é carregado (cedo) no construtor, e um quando todos os vars são carregados (atrasados).
Eu também posso adicionar variáveis à função "checkForLateHooks ()". Assim, as funções de gancho podem manipulá-las também, como a variável 'baseLayout'.
Uma função hook seria assim:
<code>public function hookConstruct ( &$baseLayout ) { $baseLayout = 'login.html'; } </code>
Agora, basicamente, minha pergunta é: essa abordagem é boa? Eu sei que provavelmente há muitas outras maneiras de fazer isso também. Mas eu principalmente não quero me deparar com problemas de design mais tarde. Parece uma boa ideia agora, mas você nunca sabe como as coisas funcionam depois ...
Se eu me lembro bem (de todos os posts que eu li), isso é meio que o WordPress faz isso (e alguns outros frameworks).