Плагины для web-приложения. Как это работает и как реализовывать?
===================================================================

 Приветствую!  

  

Вот такой вопрос у нуба возник...  

Как добавить в движок, который я пишу, поддержку плагинов?  

Просто создать контроллер, прописать к нему роутинги, это понятно, но..  

  

1. Как включать / отключать плагины? Если изменять состояние в БД, то при запуске приложения нужно будет получить список активных плагинов, с которыми потом нужно будет работать (подгружать их конфиги, классы...)  

Если с конфигами и контроллерами все понятно, то с сущностями вопрос: если данные о включенных плагинах хранятся в БД, то как инициализировать Doctrine (она в проекте используется) перед получением всех активных плагинов?  

Т.е. при инициализации ей передается массив с папками сущностей для работы, а как подгружать сущности плагинов, если их список уже после инициализации получен? Заново инициализировать?  

  

2. Как расширять уже имеющиеся классы приложения?   

Просто extends, как мне кажется, не очень подходит, ибо если несколько плагинов будут расширять один класс, это не будет работать...  

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

На словах понятно, но как расширять один класс другим в коде? 

 Плагинная система может быть основана на событиях.  

Например, в каком-то месте приложения вы вызываете подпрограмму Х, которая делает нечто полезное, и вы хотите дать возможность плагинам изменить или дополнить результат этих действий. Тогда вы вы перед или после вызова подпрограммы Х оповещаете систему определенным событием, что сейчас можно выполнить какой-то код. Если на данное событие подписан плагин, он вызывается, ему на вход передаются начальные данные, к которыми он что-то делает и возвращает результат работы системе. Вместе с данными, плагину можно передавать и все необходимые для работы интерфейсы.