Архитектура плагина php

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

Мой настоящий вопрос в том, как сделать объект слушателя доступным через приложение ». Единственные решения, о которых я могу думать прямо сейчас, - это создание основного класса слушателя / наблюдателя singleteon, чтобы любой код из любого места мог зарегистрировать слушателя.

$listener = Plugin::getInstance();
$listener->addEventListener('savePost', ....);

и для стрельбы я могу использовать тот же процесс.

OR

сделать статическим только зарегистрированный массив событий, например

private static $registeredEvents = array();
public function addEventListener($eventName, Closure $c){         
     self::$registeredEvents[$eventName] = $c;
}

Если я сделаю это, независимо от того, как объект плагина / слушателя предоставляется любому клиентскому коду, будет использоваться один и тот же контейнер ($ registerEvents).

В противном случае предоставление новых экземпляров класса слушателя другим объектам приводит к рассредоточению зарегистрированных событий. Поэтому при запуске определенных событий из системы я не могу перебирать все зарегистрированные события из разных экземпляров.

Так что, пожалуйста, покажите мне более эффективный способ сделать это.


person themightysapien    schedule 17.12.2014    source источник


Ответы (1)


Singleton Class & Static $ 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.

person Gabi Dj    schedule 07.04.2015
comment
хотя это поздний ответ. Спасибо за информацию. Я обязательно загляну в реестр zend. - person themightysapien; 08.04.2015