austinhyde/minibus

轻量级命令总线实现

v0.1.1 2016-01-02 15:43 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:20:38 UTC


README

Minibus 帮助您将接口与实现分离 - 就像您的 REST 处理器与数据库调用一样。

它受到了 Grafana 的命令总线Tactician 命令总线库的启发。

为什么我需要这个?

命令总线允许将 需要做什么如何做 解耦。随着系统变得更加复杂,像这样将接口与实现分离可以提高可维护性。

Ross Tuck 有一场 示例演讲,概述了服务层和命令总线 - 如果您认为需要命令总线,我建议您观看这个视频。

安装

通过 composer: composer require austinhyde/minibus

使用方法

Minibus 默认提供了一种非常简单的命令总线实现:Minibus\Bus

这为您提供了开始分派命令和发布事件的全部所需。

$bus = new Minibus\Bus;

$bus->addHandler(function(NewUserCommand $cmd) use ($db, $bus) {
  $row = $db->query("INSERT INTO users (username, email) VALUES (?, ?) RETURNING *",
    [$cmd->username, $cmd->email]);
  $user = User::fromRow($row);
  $bus->publish(new UserAddedEvent($user));
  return $user;
});

$bus->addListener(function(UserAddedEvent $event) use ($log) {
  $log->info("Added user: " . $event->getUser()->getUsername());
});

$router->get(function($req, $res) use ($bus) {
  $cmd = new NewUserCommand($req->body->username, $req->body->email);
  $user = $bus->dispatch($cmd);
  return $user->toJson();
});

addHandleraddListener 可以接受任何可调用项作为其第一个参数,并通过反射第一个参数的类型提示自动推断它们将注册的命令或事件的类型。如果您想覆盖命令或事件的 "类型"(不一定是类名),您可以将类型作为第二个参数指定。

dispatchpublish 可以接受任何值作为命令或事件,尽管如果它们是对象,Minibus 将使用类名自动找到正确的命令处理器或事件监听器。同样,您可以通过将类型作为第二个参数传递来覆盖 "类型"。