buonaparte / bnp-lazy-listener
这个库允许您将懒监听器附加到ZF2 EventManager
0.9.1
2014-07-23 22:54 UTC
Requires
- php: >=5.3.3
- zendframework/zend-eventmanager: 2.*
- zendframework/zend-servicemanager: 2.*
Requires (Dev)
- phpunit/phpunit: >=3.7,<4
- satooshi/php-coveralls: dev-master
- squizlabs/php_codesniffer: 1.4.*
This package is not auto-updated.
Last update: 2024-09-24 03:19:29 UTC
README
此库允许您将懒监听器附加到ZF2 EventManager。
安装
设置
-
将此项目添加到您的composer.json文件中
"require": { "buonaparte/bnp-lazy-listener": "0.9.*" }
-
现在运行以下命令来告诉composer下载BnpServiceDefinition:
$ php composer.phar update
!!! 注意 这不是一个模块,因此您无需在ZF2应用程序中启用它,此外,您可以使用与EventManager
解耦的组件使用它。
LazyListenerAggregate
在许多情况下,实例化监听器聚合可能太昂贵,尤其是当该监听器永远不会被触发时,LazyListenerAggregate
使得您能够定义实际的监听器工厂,以及未来监听器订阅的事件规范,LazyListenerAggregate
将在第一个订阅的事件被触发时实例化您的监听器。
class PlainPhpObjectWithDependencies { // Your Dependencies public function __construct($aDependency, $anotherDependency) { // ... } public function setExtraDependency($dependency) { // ... } public function onFoo(Zend\EventManager\EventInterface $e) { // do some complex stuff ... $e->setParam('foo', 'bar'); } public function onBar(Zend\EventManager\EventInterface $e) { // do some complex stuff ... $e->setParam('bar', 'baz'); } public function onBaz(Zend\EventManager\EventInterface $e) { // do some complex stuff ... $e->setParam('baz', array_merge($e->getParam('baz', array()), array('element')); } }
现在您可以将此PPO附加到EventManager
use Zend\EventManager\EventManager; use Zend\EventManager\Event; use BnpLazyListener\LazyListenerAggregate; $events = new EventManager(); $events->attach(new LazyListenerAggregate( function () use ($aDependency, $anotherDependency, $dependency) { $listener = new PlainPhpObjectWithDependencies($aDependency, $anotherDependency); $listener->setExtraDependency($dependency); return $listener; }, array( 'foo' => 'onFoo', 'bar' => array('onBar', 1000), 'baz' => array( 'onBaz', array('onBaz', -99) ) ) )); $events->trigger(new Event('an_event')); // PlainPhpObjectWithDependencies gets instantiated only now $events->trigger(new Event('foo'));
在这里我们使用了\Closure
作为工厂,然而LazyListenerAggregate
接受任何有效的callable
。如您所见,这并不提供很多灵活性,因为我们静态地包装了所有监听器依赖项,这就是第二个实用监听器派上用场的地方。
ServicesListenerAggregateCollection
这是一个ServiceLocatorAware
服务,能够聚合其他ListenerAggregate
集合,其中最重要的是上面描述的那个。所有原子监听器都称为委托,可以表示为
callable
- 调用以实例化委托的可调用对象,可选地传递一个ServiceLocatorInterface
作为唯一参数string
(实现Zend\EventManager\ListenerAggregateInterface
的有效FQ类名)string
(实现Zend\ServiceManager\FactoryInterface
的有效FQ类名)Zend\ServiceManager\FactoryInterface
实例string
- 不匹配工厂类名 - 将使ServicesListenerAggregateCollection
从当前注入的位置检索委托array
- 包含2个元素,第一个元素是上述任何一个,用于作为LazyListenerAggregate
的懒工厂,第二个元素是一个定义正在监听的事件的数组,这是LazyListenerAggregate
的第二个构造函数参数
现在我们可以使用仅配置数组一次定义多个监听器
use Zend\ServiceManager\ServiceManager; use Zend\EventManager\EventManager; use BnpLazyListener\ServicesListenerAggregateCollection; $delegates = array( 'a_listener_aggregate_service', 'MyApp\Factory\ListenerAggregateFactoryService', array( 'PlainPhpObjectWithDependencies', array( 'foo' => 'onFoo', 'bar' => array('onBar', 1000), 'baz' => array( 'onBaz', array('onBaz', -99) ) ) ) ); $services = new ServiceManager(); // declare your a_listener_aggregate_service and PlainPhpObjectWithDependencies services in the container $listener = new ServicesListenerAggregateCollection($delegates); $listener->setServiceLocator($services); $events = new EventManager(); $events->attach($listener); $events->trigger(new Event('an_event')); // PlainPhpObjectWithDependencies gets pulled from the locator only now $events->trigger(new Event('bar'));