я просто играю с php, чтобы создать архитектуру плагина.
для этого я использую шаблон прослушивателя событий (посредник), где код может прослушивать / запускать событие.
Мой реальный вопрос — как сделать объект слушателя доступным через приложение?
Единственные решения, о которых я могу подумать сейчас, делают основной класс слушателя / наблюдателя одиночным, поэтому любой код из любого места может зарегистрировать слушателя.
$listener = Plugin::getInstance();
$listener->addEventListener('savePost', ....);
и для стрельбы также я могу использовать тот же процесс.
ИЛИ ЖЕ
например, сделать статичным только зарегистрированный массив событий
private static $registeredEvents = array();
public function addEventListener($eventName, Closure $c){
self::$registeredEvents[$eventName] = $c;
}
Если я делаю это независимо от того, как объект плагина / слушателя предоставляется любому клиентскому коду
тот же контейнер ($ selectedEvents) будет использоваться.
В противном случае предоставление новых экземпляров класса слушателя другим объектам приводит к рассредоточению зарегистрированных событий. Таким образом, при запуске определенных событий из системы, я не могу перебрать все зарегистрированные события из разных экземпляров.
Так что, пожалуйста, кто-нибудь покажет мне более эффективный способ сделать это.
Синглтон Класс & Статический $ selectedEvents — хороший способ сделать это
Вы не загружаете память, поскольку вы используете только статический экземпляр и статические registerEvents, которые выделены только один.
В PHP, когда вы работаете с объектами, вы на самом деле работаете с указателями этих объектов
Вы также можете использовать реестр (например, Zend_Registry) и хранить единственный и единственный экземпляр в реестре.
Образец:
$registry = Zend_Registry::getInstance();
$registry->set('listener', $listener); // or
// $registry->listener = $listener;
Для загрузки вы будете использовать:
// $registry = Zend_Registry::getInstance(); // if needed
$registry->listener->addEventListener();
Вы также можете сделать функцию статической, и вам даже не нужно создавать экземпляры, вы используете только:
My_Listener_Class::addEventListener();
Для большего количества идей рассмотрите проверку этого вопроса:
http://stackoverflow.com/questions/42/best-way-to-allow-plugins-for-a-php-application
Это может помочь вам. Он содержит несколько хороших способов интеграции плагинов в php.
Других решений пока нет …