Архитектура плагинов в PHP

Я планирую провести исследование о том, как реализовать архитектуру подключаемого модуля в PHP. Я попытался найти в Интернете возможные ссылки, но я подумал, что, может быть, мой поиск хорошей справки будет более быстрым и более уместным, если я попрошу здесь.

Кто-нибудь здесь пытался использовать плагиновую архитектуру для веб-проектов?

Спасибо, Эрвин

Solutions Collecting From Web of "Архитектура плагинов в PHP"

Я написал плагины WordPress, и магия, на которую они полагаются, – «Переменные имена функций». Например, это действительный php, в котором вызов функции phpinfo () будет вызываться:

$func_name="phpinfo"; $func_name(); 

Это позволяет разработчикам выполнять вызовы функций «Hook», как в случае переопределения их собственными функциями без изменения остальной части приложения. Модули ядра Linux полностью связаны с «подключением», они не будут работать без такого поведения.

К сожалению для имен переменных переменной PHP это отвратительный хак, который потребляет много ресурсов. Все функции в пространстве имен помещаются в список, и этот список нужно искать, пока перед вызовом функции это O (log2 (n)). Также имейте в виду, что переменные имена функций не могут быть ускорены надлежащим образом в HipHop, хотя код все равно будет преобразован в действительный C ++. Лучшим подходом было бы повторно объявить такие функции, как вы можете в python, что было бы сложностью O (1), но команда разработчиков PHP HATES эта идея (да, я просил эту функцию!).

Удачи!

Существует много концепций, которые можно рассматривать как «плагин». Вы можете написать систему плагинов, используя:

  • Диспетчеры событий (см. Диспетчер событий Symfony )
  • Middlewares (см. Silex middlewares )
  • Шаблон наблюдателя OO (см. Google / Wikipedia)
  • И многие другие

Вы можете посмотреть, как Zend Framework реализовал свой компонент Plugin Loader .

В основном вы устанавливаете путь к тому, где хранятся плагины, и загрузчик пытается загрузить первый плагин, найденный в LIFO.

Что относительно этих двух классов

  1. Обработчик / загрузчик плагинов
  2. Plugin

и есть некоторые правила

  1. Plugin Handler / Loader – это одноэлементный класс и управляет всеми дочерними кланами класса Plugin.
  2. Любые плагины должны быть унаследованы от Plugin Class.
  3. Класс Plugin имел бы предопределенные свойства и методы, которые могут быть перезаписаны его дочерними классами, поэтому альтернативный метод привязки системы (но я не уверен в какой-либо существенной разнице в результатах).

Например, скажем, класс Plugin имеет свойство url_routes со значением по умолчанию для пустого массива, тогда дочерний класс может перезаписывать и добавлять любые требуемые URL-адреса в этом массиве.

Обработчик плагинов / загрузчик затем добавит эти маршруты URL из дочернего класса в базовую систему.

не забывайте о функции __autoload . вы можете динамически загружать компоненты. как:

 SomeModule::test(); function __autoload($class) { $class = preg_replace('/^\W/', '', strtolower($class)); include 'modules/'.$class.'.php'; }