mitch / event-dispatcher
专注于领域事件的 Event Dispatcher
0.1
2014-03-08 10:35 UTC
Requires
- php: >=5.4.0
Requires (Dev)
- mockery/mockery: dev-master
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);
就是这样!
稍后再说