命令管道

在命令被派发到处理器之前,你也可以将它通过"命令管道"传递到其他类去。命令管道操作上如 HTTP 中间件,除了是专门来给命令用的,例如,一个命令管道能够在数据库事务处理期间包装全部的命令操作,或者仅作为执行纪录。

要将管道添加到 bus,只要从AppProvidersBusServiceProvider::boot 方法调用调用员的pipeThrough 方法:

$dispatcher->pipeThrough(["UseDatabaseTransactions", "LogCommand"]);

一个命令管道被定义在 handle 方法,就如个中间件:

class UseDatabaseTransactions {

    public function handle($command, $next)
    {
        return DB::transaction(function() use ($command, $next)
        {
            return $next($command);
        });
    }

}

命令管道是透过 IoC 容器来达成,所以请自行在构造器类型提示所需的依赖。

你甚至可以定义一个 闭包 来作为命令管道:

$dispatcher->pipeThrough([function($command, $next)
{
    return DB::transaction(function() use ($command, $next)
    {
        return $next($command);
    });
}]);
文章导航