heybigname/event-dispatcher

专注于领域事件的 Event Dispatcher

1.1.2 2014-06-20 11:54 UTC

This package is not auto-updated.

Last update: 2024-09-10 02:44:29 UTC


README

Latest Stable Version License Build Status Coverage Status Total Downloads

一个专注于领域事件的 Event Dispatcher。

目录

安装

运行以下命令通过 Composer 安装

composer require heybigname/event-dispatcher

集成

尽管这个包是完全框架无关的,但它确实与某些框架有集成。目前仅包括 Laravel 4.x,但如果有需求,可以添加其他框架。

Laravel

要将它安装到 Laravel 项目中,首先执行 composer install,然后向你的 config/app.php 服务提供者列表中添加以下类。

'BigName\EventDispatcher\Integrations\Laravel\ServiceProvider',

这就是 Laravel 集成的全部内容。现在可以注入或创建一个这样的 Dispatcher

use BigName\EventDispatcher\Dispatcher;

class RegisterMemberHandler implements Handler
{
    private $dispatcher;

    public function __construct(Dispatcher $dispatcher)
    {
        $this->dispatcher = $dispatcher;
    }
}
$dispatcher = App::make('BigName\EventDispatcher\Dispatcher');

工作原理

事件

在你的领域内创建一个事件,比如当一个新成员注册时。我们可以称这个事件为 MemberWasRegistered。这个事件将包含监听器执行其任务所需的所有信息。关于它接受的参数,你拥有完全的自由,因为你会是传递它们的人。从某种意义上说,这个事件是一个 Data Transfer Object (DTO)。

例如

<?php namespace Domain\Accounts\Events;

use BigName\EventDispatcher\Event;

class MemberWasRegistered implements Event
{
    private $member;

    public function __construct($member)
    {
        $this->member = $member;
    }

    public function getMember()
    {
        return $this->member;
    }

    public function getName()
    {
        return 'MemberWasRegistered';
    }
}

监听器

没有监听器的事件对我们来说没有任何好处,所以让我们为 MemberWasRegistered 事件创建一个电子邮件监听器 WelcomeNewlyRegisteredMemberListener

<?php namespace Domain\Accounts\EventListeners;

use BigName\EventDispatcher\Listener;
use BigName\EventDispatcher\Event;

class WelcomeNewlyRegisteredMemberListener implements Listener
{
    private $mailer

    public function __construct($mailer)
    {
        $this->mailer = $mailer;
    }

    public function handle(Event $event)
    {
        // Do something with the event
    }
}

监听器和事件一样,参数的选择权完全在你。当事件被分发时,正确的监听器的 handle 方法将被调用。

监听

现在我们已经准备好了构建块,让我们开始监听一些新成员,怎么样。为了这个示例,代码尽可能地保持简单。

use BigName\EventDispatcher\Dispatcher;
use Domain\Accounts\Events\MemberWasRegistered;
use Domain\Accounts\EventListeners\WelcomeNewlyRegisteredMemberListener;

// Listening for event
$mailer = // Some mail package...
$listener = new WelcomeNewlyRegisteredMemberListener($mailer);

$dispatcher = new Dispatcher;
$dispatcher->addListener('MemberWasRegistered', $listener);

// Dispatching event
$member = // A wild member appeared..
$event = new MemberWasRegistered($member);

$dispatcher->dispatch($event);

懒加载监听

你的监听器可以是懒加载的。只需传递一个包含完整命名空间类的字符串。目前这仅适用于 Laravel (Illuminate) 容器。如果请求,可以支持其他容器。

use Illuminate\Container\Container;
use BigName\EventDispatcher\Dispatcher;
use BigName\EventDispatcher\Containers\LaravelContainer;

$container = new LaravelContainer(new Container);
$dispatcher = new Dispatcher($container);

$dispatcher->addLazyListener('MemberWasRegistered', 'Domain\Accounts\EventListeners\WelcomeNewlyRegisteredMemberListener');

这将在 dispatch()getLazyListeners() 上构造和实例化监听器。懒加载监听器可以帮助减少如果你在引导时实例化了所有监听器的开销。

分发多个事件

为了获得额外的酷炫分数,你可以在一次调用中分发多个事件。

use BigName\EventDispatcher\Dispatcher;
use Domain\Accounts\MemberWasRegistered;
use Domain\Achievements\MemberEarnedAchievement;

$member = ...;
$achievement = ...;
$events = [
    new MemberWasRegistered($member),
    new MemberEarnedAchievement($member, $achievement)
];

$dispatcher = new Dispatcher;
$dispatcher->dispatch($events);

维护者

此包由 Big Name 的 Mitchell van Wijngaarden 维护

许可证

此包根据 MIT 许可证 许可。