buonaparte/bnp-lazy-listener

这个库允许您将懒监听器附加到ZF2 EventManager

0.9.1 2014-07-23 22:54 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:19:29 UTC


README

Build Status Coverage Status Latest Stable Version Latest Unstable Version

此库允许您将懒监听器附加到ZF2 EventManager。

安装

设置

  1. 将此项目添加到您的composer.json文件中

    "require": {
        "buonaparte/bnp-lazy-listener": "0.9.*"
    }
  2. 现在运行以下命令来告诉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'));