robrogers3/commandbus

commandbus for php53

1.0.1 2016-12-24 04:53 UTC

This package is auto-updated.

Last update: 2024-09-20 16:12:30 UTC


README

Latest Version on Packagist Software License Build Status Total Downloads

这是一个php5.3的CommandBus实现。它基于illuminate/events。这需要一些其他包:illuminate/support,illuminate/contracts,和illuminate/container。

CommandBus允许你在php项目中利用命令和领域事件。

基本上,增加的价值是将类或方法中的大量过程式代码替换为只做一件事的类。这些类通过CommandBus和CommandHandlers启动的事件松散耦合在一起。

以下的使用示例是最好的解释。

安装

通过Composer

$ composer require robrogers3/commandbus

用法

要求

你有一个使用illiminate包的应用程序。特别是illiminate/events。

你的目标

有一个完成许多子任务的任务的方法。也许目前这些子任务都在一个类中,甚至只是一个方法中。某种形式的上帝对象。

解决方案

使用命令总线启动(分配)必要的类来完成在一个地方完成的工作。

初始设置

你需要创建一个引导方法或函数来初始化illuminate容器(IOC)。这个方法应该

  • 注册容器。
  • 创建illuminate/event调度器的实例。
  • 注册所有的事件监听器。**监听器可以是完全写出的,如'Acme\UserHasRegistered'。或者更好的是'Acme.*',后者可以捕获所有以Acme为前缀的事件
  1. 定义你的监听器
    $listeners = array(
        'Acme\SendWelcomeEmail',
        'Acme\AddToLdap',
        'Acme\ConfigurePermissions'
    );
  1. 在你的引导方法中,注册它们
    App::instance('Dispatcher', $dispatcher);

    $listeners = getAppListeners();

    foreach ($listeners as $listener) {
        $dispatcher->listen('App.*', $listener);
    }

开始工作

  1. 创建你的命令。这是一个简单的类,类似于DTO。这是被扔进命令总线的。这里有一个简单的例子
namespace Acme;

class RegisterUserCommand
{
    public $username;

    public function __construct($username)
    {
        $this->username = $username;
    }
}
  1. 接下来,让我们创建一个监听器,比如
namespace Acme;

use RobRogers\CommandBus\Eventing\EventListener;

class SendWelcomeEmail extends EventListener
{

    public function whenUserHasRegistered(UserWasRegistered $event)
    {
        dump( 'Sending mail to ' . $event->user->username);
    }
}
  1. 创建你的命令处理器。命令总线在这个类上调用handle方法。
namespace Acme;

use RobRogers\CommandBus\CommandHandler;

class UserRegisterCommandHandler implements CommandHandler
{
    /**
     * @var EventDispatcher
     */
    private $dispatcher;
    /**a
     * @var EventGenerator
     */
    private $eventGenerator;

    /**
     * @param EventDispatcher $dispatcher
     * @param EventGenerator $eventGenerator
     */
    public function __construct(EventDispatcher $dispatcher, EventGenerator $eventGenerator)
    {
        $this->dispatcher = $dispatcher;

        $this->eventGenerator = $eventGenerator;
    }

    public function handle(/* user registered command */ $command)
    {
        $event = new Acme\UserHasRegistered($command);
        $this->eventGenerator->register($event); //you can register many events
    }
}
  1. 最后创建我们正在监听的事件。这也是一个DTO,它包含上述UserRegister $command。
namespace Acme;

/**
* I am  THE EVENT
* the command data get's shoved inside me. like $this->user->username
*/
class UserHasRegisteredEvent
{
    public $user;
    
    /** @var UserRegister $user */
    public function __construct($user)
    {
        $this->user = $user;
    }
}
  1. 使用它
$command = new RegisterUserCommand("Rob Rogers");

/** @var \RobRogers\CommandBus\BaseCommandBus $commandBus */
$commandBus = App::Make('\RobRogers\CommandBus\BaseCommandBus');

$commandBus->execute($command);
  1. 看看会发生什么

如果你注册了上述三个监听器,它们都会被触发。

  • 向用户发送欢迎邮件。
  • 将他们添加到ldap(或任何地方)
  • 配置他们的系统权限

底线在你的控制器或其他地方。你只需要3行

  • 实例化命令。
  • 创建命令总线。
  • 调用execute方法。

对于上述三个任务,直接调用它们并没有什么大不了的。但是如果你有很多事情要做,那么它可以使事情变得相当整洁。

变更日志

有关最近更改的更多信息,请参阅CHANGELOG

测试

$ composer test

贡献

有关详细信息,请参阅CONTRIBUTINGCONDUCT

安全

如果你发现任何与安全相关的问题,请通过电子邮件robrogers@me.com而不是使用问题跟踪器。

鸣谢

许可

麻省理工学院许可证(MIT)。请参阅许可证文件以获取更多信息。