Я бы использовал (или работаю над) то, что я называю "Emvc" (или События и мини MVC).
С событиями, в основном, вы можете создать систему событий, которую вы используете в качестве посредника (это шаблон), когда вы общаетесь между модалами с помощью посредника. Тогда мини MVC в основном на плагин на основе плагинов. Таким образом, каждый плагин реализует свой собственный MVC.
Некоторые примеры.
Пользовательская система. Проблема с MVC. Вы положили эту систему в
app/contolers/user
app/models/user
app/view/user ..
Например, теперь, когда вы хотите добавить, удалите его, очень трудно отделить его от MVC.
С Emvc
вы бы структурировали его таким образом.
app/plugins/user/contoller
app/plugins/user/models
app/plugins/user/views
Тогда вы зарегистрируете его для определенных событий, таких как события запроса для страниц, которые он тоже прослушивает. Я также слушал бы такие вещи, как getCurrentUser
и т. Д. Это кажется простым. но что происходит, вы делаете что-то вроде этого
//users bootstrap
$Mediator->listen('GetCurrentUser')
//called from some other plugin
$Mediator->trigger('GetCurrentUser', $event)
Затем Посредник проверяет, есть ли у него слушатели для этого события, и, если это так, передает им четный объект. Затем слушатель возвращает пользователя и измененный объект события. И до тех пор, пока у вас есть надлежащие интерфейсы. Что это делает, так это тому, что звонящему больше не важно, откуда пришел пользователь. Это может быть от class OldUserSystem
или class NewUserSystem
, потому что у вас есть разделительный слой.
В обычном MVC вам придется напрямую вызывать пользовательскую систему, вызывая модель.
$Users = new User();
$CurrentUser = $Users->getCurrentUser();
Теперь, если вы замените class User
чем-то другим, вы застряли, используя то же имя, с тем же вызовом метода или переписав свой код. Реализация слушателя скрыта от глаз. Возможно, пользовательская система вызывает этот метод foobar
, звучит нелепо, но с событиями вы можете сделать это вызванным этим событием.
Также, если событие не обрабатывается, вы можете сообщить об этом в вызывающей программе и действовать соответствующим образом, потому что, возможно, пользовательской системы вообще нет. Также каждая пользовательская система должна отображать свои собственные страницы, выполнять свою собственную маршрутизацию и т. Д. И т. Д.
Еще один хороший пример - выставление счетов.
Кто-то что-то покупает на вашем сайте, используете ли вы Stripe, Paypal, Athorize dot net. С системой событий. Вы просто запускаете событие, чтобы doPayment
отправлять информацию как часть объекта события. И любая платежная система, которая перечисляет, может справиться с этим. Вы можете изменить платежную систему, даже не касаясь чего-либо, вплоть до обработки.
и т.д ...
Я скажу вам, что строить это не тривиально. Это вопрос определения ответственности каждого «Плагина» и того, чтобы он делал только эти вещи, и таким образом, чтобы он был невидим для других «Плагинов».