命令管道
在命令被派发到处理器之前,你也可以将它通过"命令管道"传递到其他类去。命令管道操作上如 HTTP 中间件,除了是专门来给命令用的,例如,一个命令管道能够在数据库事务处理期间包装全部的命令操作,或者仅作为执行纪录。
要将管道添加到 bus,只要从App\Providers\BusServiceProvider::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);
});
}]);