mitch/event-dispatcher

专注于领域事件的 Event Dispatcher

0.1 2014-03-08 10:35 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:23:39 UTC


README

此仓库已迁移至 Big Name。这里不会有任何支持。请访问 Big Name 的仓库以获取最新更新。

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

安装

首先通过 Composer 安装此包。编辑您的项目 composer.json 文件以要求 mitch/event-dispatcher

"require": {
  "mitch/event-dispatcher": "0.1.x"
}

接下来使用 Composer 通过终端更新您的项目

php composer.phar update

一旦安装了包,您需要添加服务提供者。打开您的 app/config/app.php 配置文件,并向 providers 数组添加一个新项目。

'Mitch\EventDispatcher\Laravel\EventDispatcherServiceProvider'

工作原理

事件

在您的领域内创建一个事件,例如,当新用户被添加时。让我们称这个事件为 UserCreatedEvent。此事件将包含执行其工作所需的所有必要信息。关于它需要哪些参数,您有完全的自由,因为您将是传递它们的人。在某种程度上,这个事件是一个 数据传输对象 (DTO)。

例如

<?php namespace Domain\Accounts\Events;

use Mitch\EventDispatcher\Event;

class UserCreatedEvent implements Event
{
    public $user;

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

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

监听器

没有监听器的事件对我们没有帮助,所以让我们为 UserCreatedEvent 事件创建一个邮件监听器 MailNewlyCreatedUserListener

<?php namespace Domain\Accounts\EventListeners;

use Mitch\EventDispatcher\Listener;

class MailNewlyCreatedUserListener implements Listener
{
    private $mailer

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

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

与事件一样,监听器也有相同的规则,您在参数方面有完全的自由。当事件被分发时,正确监听器的 handle 方法将被调用。

监听

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

use Mitch\EventDispatcher\Dispatcher;
use Domain\Accounts\Events\UserCreatedEvent;
use Domain\Accounts\EventListeners\MailNewlyCreatedUserListener;

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

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

// Dispatching event
$user = // A wild user appeared..
$event = new UserCreatedEvent($user);

$dispatcher->dispatch($event);

分发多个事件

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

use Mitch\EventDispatcher\Dispatcher;
use Domain\Accounts\UserAddedEvent;
use Domain\Achievements\UserGotAchievementEvent;

$user = ...;
$achievement = ...;
$events = [
    new UserAddedEvent($user),
    new UserGotAchievementEvent($user, $achievement)
];

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

就是这样!

稍后再说