我正在开发一款处理视频的应用。我尝试将10个视频推入队列。处理完视频后,我发了这样一个事件:
...
$production->render();
event(new VideoHasProcessed(basename($this->video->path)));
...
我按照此视频向用户发送通知(https://laracasts.com/series/whats-new-in-laravel-5-1/episodes/12)
问题是:我想在处理每个视频时发送通知,但事实上,在处理了10个视频后,显示了通知。
这是我的剧本:
<script>
(function () {
var pusher = new Pusher(PUSHER_ID, {
encrypted: true
});
var channel = pusher.subscribe('test');
channel.bind('App\\Events\\VideoHasProcessed', function(data) {
console.log(data);
});
})();
</script>
更新
派遣工作
foreach ($request->input('files') as $file)
{
...
// Dispatch a job.
$this->dispatch(new ProduceVideo($video));
....
}
我的工作班:
公共函数句柄(ProductionRepository $ production) { ...
$production->render();
event(new VideoHasProcessed(basename($this->video->path)));
...
}
答案 0 :(得分:3)
在深入laravel 5.3核心后,我找到了解决方案。您的事件类需要扩展ShouldBrodcastNow接口:
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class MyEvent implements ShouldBrodcastNow
{
...
}
通过这种方式,如果您需要立即广播该事件,这应该可以解决问题。
注意:MyEvent
无需实现两个接口(ShouldBroadcastNow, ShouldBroadcast)
,因为接口ShouldBroadcastNow
已经扩展ShouldBroadcast
答案 1 :(得分:0)
如果您的10个视频中的每个视频都作为单独的排队作业处理,您只需在每个排队作业中触发您的活动。这是一个作业类的示例句柄函数(参见https://laravel.com/docs/5.2/queues#job-class-structure):
/**
* Execute the job.
*/
public function handle()
{
// Your video processing script
// Fire your event
event(new VideoHasProcessed(basename($this->video->path)));
}
如果您的视频作为1个作业处理,则您需要在可能用于处理每个视频的任何循环中添加您的活动:
foreach($videos as $video):
// Your video processing script
// Fire your event
event(new VideoHasProcessed(basename($this->video->path)));
endforeach;