没有渠道的火灾排队工作?

时间:2016-06-24 14:20:32

标签: php laravel pusher

当频道为空时,有没有办法抑制排队的作业触发广播事件?基本上我注意到的是,如果broadcastOn返回[],则没有套接字推送会关闭,但它仍然会排队。当broadcastOn返回一个至少包含一个元素的数组时,是否有任何方法可以创建排队作业?

2 个答案:

答案 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

  

检查是否应按条件广播事件。