Здравствуйте! Как лучше сделать mvc систему с поддержкой плагинов. Например контроллер administrator отвечает за редактирование пользователей (удаление, редактирование) необходимо добавить новую функцию в этот контроллер. Пользователь загружает плагин, как он будет взаимодействовать с системой. P.S. Сам думаю плагин это класс. Администратор запрашивает например редактирование пользователя. Если метод редактирования не находиться в контроллере, он ищется в классах плагинов. Это правильное решение?
Что тогда такое плагин, если рассматривать с точки зрения hmvc? Это триада mvc? И для каждого плагина свой контроллер, модель и представления?
скорее наоборот, подключенные дополнительно штуки должны иметь бОльший приоритет, чем основа. так можно будет переопределить поведение основной системы. думай о плагинах как о декораторах.
artoodetoo, а можно вообще отказаться от стандартного контроллера? То есть вся функциональность cms заключается в плагинах, а контроллеры плагинов наследуют интерфейс. Добавлено спустя 35 минут 11 секунд: Еще читал, что подобные системы делаются на основе паттерна observer. Все плагины хранятся в массиве, а потом вызывается метод который есть во всех плагинах. Но я не вижу смысла его использовать. Если пользователь запрашивает метод например view_post. Откуда нам знать есть ли он в плагине. И придется опять применять всякие проверки. И какой смысл в observer?
есть такой тип в php - callable, позволяет вызывать функции, имя которых определённым образом занесено в переменную. Где-то в системе создаётся массив вида Код (Text): $listeners = ['event_name'=>'event_function', 'event_name1'=>'event_function1'] И после этого проверяется, если имя события есть есть в этом массиве, то вызывается соотв. функция. Это если упрощённо. В spl даже есть интерфейсы и классы на эту тему
Вроде бы начинаю врубаться, плагины это отдельные функции(простой способ) которые зарегестрированы в массиве системы, и исполняются тогда, когда происходит определенное событие?
Ну грубо говоря да. Но в callable можно хранить не только отдельные функции, это могут быть и статические функции, и методы класса. https://php.net/manual/ru/language.types.callable.php. Я сейчас использую этот подход использую совместно с MVC в текущем проекте доски объявлений. Там будут объявления трёх типов, захотелось попробовать избежать типичного (ну по крайней мере до сих пор и я сам так писал, и мне в чужих проектах попадалось) дублирования кода.
А как определить событие которого нет в системе, чтобы вызвать соответствующий плагин? С помощью __call?
Можно, главное чтобы эта вся магия была описана в документации или был наглядный код, это просто совет
Хотя нет, лучше наверное иметь "стандартный" функционал системы, его хоть можно расширить или заменить, с помощью плагина, а то так вся система на плагинах ничем не отличается от стандартной архитектуры mvc. Наверное я правильно думаю.
ну контроллер сущность обстрактная. Когда у тебя апач обрабатывает по умолчанию пхпшки, и работают ссылки типа *.php, то получается что апач выполняет функцию контроллера, а вьюху и модель можно сделать уже на пхп. При чем вьюху можно опционально запилить на ASP внезапно.
Если плагин - обычная функция все ясно.А как действовать, если плагин - набор классов и файлов (mvc). Или лучше использовать обычную функцию?
А как для разных типов пользователей сделать доступность определенных методов плагина? Хранить названия методов в базе ролей пользователей?