Архитектура плагина php
Я пытаюсь придумать способ создания архитектуры плагинов для моей собственной инфраструктуры. Я прочитал множество тем и опубликовал здесь и на других сайтах. И в основном я пришел к следующему решению, которое кажется единственным хорошим вариантом в PHP (в настоящее время).
Идея состоит в том, что каждый класс расширяет своего рода класс наблюдателя. Таким образом, класс Template, BaseController и т. Д. Всегда расширяют класс 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>
Так что здесь в основном происходит то, что когда indexController расширяет baseController, выполняется проверка плагинов. В этом случае для конструктора. Это может быть удобно, когда вы хотите выполнить какую-то проверку входа в систему с помощью плагина, прежде чем метод Action будет фактически вызван.
Класс Plugin может определить, из какого класса вызывается, и знает, какие функции нужно искать в загруженных плагинах.
Также обратите внимание, что он проверяет список загруженных плагинов 2 раза. Один перед чем-либо загружается (рано) в конструктор, и один, когда все переменные загружаются (поздно).
Я также могу добавить переменные в & quot; checkForLateHooks () & quot; функция. Таким образом, функции-ловушки также могут манипулировать ими, например, «baseLayout». переменная.
Функция ловушки будет выглядеть так:
<code>public function hookConstruct ( &$baseLayout ) { $baseLayout = 'login.html'; } </code>
Теперь, в основном, мой вопрос: хорош ли этот подход? Я знаю, что, вероятно, есть много других способов сделать это тоже. Но я в основном не хочу сталкиваться с проблемами дизайна позже. Сейчас это кажется хорошей идеей, но вы никогда не знаете, как все получится позже ...
Если я правильно помню (из всех постов, которые я прочитал), это похоже на то, как это делает WordPress (и некоторые другие фреймворки).