За последние 24 часа нас посетили 20855 программистов и 1136 роботов. Сейчас ищут 325 программистов ...

mvc система с поддержкой плагинов

Тема в разделе "Прочие вопросы по PHP", создана пользователем irobot, 15 ноя 2014.

  1. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Здравствуйте!
    Как лучше сделать mvc систему с поддержкой плагинов. Например контроллер administrator отвечает за редактирование пользователей (удаление, редактирование) необходимо добавить новую функцию в этот контроллер. Пользователь загружает плагин, как он будет взаимодействовать с системой.

    P.S. Сам думаю плагин это класс. Администратор запрашивает например редактирование пользователя. Если метод редактирования не находиться в контроллере, он ищется в классах плагинов. Это правильное решение?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
  3. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Спасибо, буду разбираться,возникнут вопросы напишу в этой теме.
     
  4. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Что тогда такое плагин, если рассматривать с точки зрения hmvc? Это триада mvc? И для каждого плагина свой контроллер, модель и представления?
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    скорее наоборот, подключенные дополнительно штуки должны иметь бОльший приоритет, чем основа. так можно будет переопределить поведение основной системы. думай о плагинах как о декораторах.
     
  6. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    artoodetoo, а можно вообще отказаться от стандартного контроллера? То есть вся функциональность cms заключается в плагинах, а контроллеры плагинов наследуют интерфейс.

    Добавлено спустя 35 минут 11 секунд:
    Еще читал, что подобные системы делаются на основе паттерна observer. Все плагины хранятся в массиве, а потом вызывается метод который есть во всех плагинах. Но я не вижу смысла его использовать. Если пользователь запрашивает метод например view_post. Откуда нам знать есть ли он в плагине. И придется опять применять всякие проверки. И какой смысл в observer?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Просто начинай делать.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    .
    Плагин в таком случае просто регистрирует, что готов обработать событие view_post.
     
  9. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Как понять регистрирует, что готов обработать view_post?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    есть такой тип в php - callable, позволяет вызывать функции, имя которых определённым образом занесено в переменную. Где-то в системе создаётся массив вида
    Код (Text):
    1.  
    2. $listeners = ['event_name'=>'event_function', 'event_name1'=>'event_function1']
    И после этого проверяется, если имя события есть есть в этом массиве, то вызывается соотв. функция. Это если упрощённо. В spl даже есть интерфейсы и классы на эту тему
     
  11. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Вроде бы начинаю врубаться, плагины это отдельные функции(простой способ) которые зарегестрированы в массиве системы, и исполняются тогда, когда происходит определенное событие?
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Ну грубо говоря да. Но в callable можно хранить не только отдельные функции, это могут быть и статические функции, и методы класса. https://php.net/manual/ru/language.types.callable.php. Я сейчас использую этот подход использую совместно с MVC в текущем проекте доски объявлений. Там будут объявления трёх типов, захотелось попробовать избежать типичного (ну по крайней мере до сих пор и я сам так писал, и мне в чужих проектах попадалось) дублирования кода.
     
  13. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    А как определить событие которого нет в системе, чтобы вызвать соответствующий плагин? С помощью __call?
     
  14. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Да можно через __call
     
  15. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    А можно ли вообще отказаться от стандартного контроллера? Вообще все на плагинах?
     
  16. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Можно, главное чтобы эта вся магия была описана в документации или был наглядный код, это просто совет
     
  17. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Хотя нет, лучше наверное иметь "стандартный" функционал системы, его хоть можно расширить или заменить, с помощью плагина, а то так вся система на плагинах ничем не отличается от стандартной архитектуры mvc. Наверное я правильно думаю.
     
  18. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    посмотри на бандлы в symfony2
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    то, что будет ворошить плагины, и будет контроллером. =)
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    получается отказаться от контроллера ради контроллера?))
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну контроллер сущность обстрактная. Когда у тебя апач обрабатывает по умолчанию пхпшки, и работают ссылки типа *.php, то получается что апач выполняет функцию контроллера, а вьюху и модель можно сделать уже на пхп. При чем вьюху можно опционально запилить на ASP внезапно.
     
  22. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    Если плагин - обычная функция все ясно.А как действовать, если плагин - набор классов и файлов (mvc). Или лучше использовать обычную функцию?
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Интерфейсы, абстрактные классы и т.п.
     
  24. irobot

    irobot Новичок

    С нами с:
    15 ноя 2014
    Сообщения:
    88
    Симпатии:
    0
    А как для разных типов пользователей сделать доступность определенных методов плагина? Хранить названия методов в базе ролей пользователей?
     
  25. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    ACL, RBAC выбирай любой