当频道为空时,有没有办法抑制排队的作业触发广播事件?基本上我注意到的是,如果broadcastOn
返回[]
,则没有套接字推送会关闭,但它仍然会排队。当broadcastOn
返回一个至少包含一个元素的数组时,是否有任何方法可以创建排队作业?
答案 0 :(得分:1)
你必须做一些手动子类化才能使这项工作成功。排队作业是使用broadcastEvent
的{{1}}方法创建的。
Illuminate\Events\Dispatcher
如果protected function broadcastEvent($event)
{
if ($this->queueResolver) {
$connection = $event instanceof ShouldBroadcastNow ? 'sync' : null;
$queue = method_exists($event, 'onQueue') ? $event->onQueue() : null;
$this->resolveQueue()->connection($connection)->pushOn($queue, 'Illuminate\Broadcasting\BroadcastEvent', [
'event' => serialize(clone $event),
]);
}
}
返回一个至少包含一个元素的数组,则可以在此处添加一个检查,仅将作业推送到队列中。
一旦子类化,您将需要使用新的调度程序来触发事件。您可以为此创建新的服务提供者并将其绑定到容器。我不确定您是否可以覆盖$event->broadcastOn
中创建的现有events
实例,但您肯定可以创建一个新实例。
Illuminate\Events\EventServiceProvider
如果您正在使用事件外观,请务必同时更新配置文件以指向将新密钥返回到新CustomDispatcher的新Facade。不幸的是,public function register()
{
$this->app->singleton('events-custom', function ($app) {
return (new App\Provides\CustomDispatcher($app))->setQueueResolver(function () use ($app) {
return $app->make('Illuminate\Contracts\Queue\Factory');
});
});
}
辅助函数仍将返回原始的Dispatcher。我不相信这可以被覆盖。如果您可以以某种方式覆盖events()
设置的现有events
密钥,那么您就已经完成了设置。
答案 1 :(得分:0)
在Laravel 5.4中,您现在可以在事件broadcastWhen
上添加新方法。所有这些都需要完成:
public function broadcastOn() {
return [];
}
public function broadcastWith() {
return count($this->broadcastOn()) > 0;
}
您可以详细了解source code中如何处理broadcastWhen
。
检查是否应按条件广播事件。