2016-03-30 4 views
2

Я разрабатываю приложение для обработки видео. Я пытаюсь нажать 10 видео в очередь. После того, как видео было обработано, я выстрелил событие так:Laravel Broadcasting and Queues

... 
$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> 

Update:

Отправка задания

foreach ($request->input('files') as $file) 
    { 
     ... 

     // Dispatch a job. 
     $this->dispatch(new ProduceVideo($video)); 

     .... 
    } 

И моя работа класс:

публичную функцию ручки (ProductionRepository $ производство) { ...

$production->render(); 

event(new VideoHasProcessed(basename($this->video->path))); 

... 

}

ответ

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; 
+0

Я выстрелил мое событие в каждой очереди уже работу. Но он все равно отображает уведомление при обработке 10 видеороликов. Я просто добавил больше кода в свой пост. – user3118789

+0

Даже когда я добавляю 1 видео в очередь и первое видео обрабатывает, я добавляю еще 1 видео, он все равно не нажимает отдельное уведомление. Когда обрабатывается 2 видеоролика, 2 сообщения сдвигаются вместе. – user3118789

+0

, пожалуйста, помогите мне !!! Спасибо. – user3118789

3

После того, как выкопали ядро ​​laravel 5.3, я нашел решение. You класс событий необходимо расширить интерфейс ShouldBrodcastNow:

use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; 

class MyEvent implements ShouldBrodcastNow 
{ 
... 
} 

Таким образом, если вам нужно событие будет транслироваться сразу же, это должно сделать трюк.

Примечание: не существует потребность в MyEvent реализовать оба интерфейса (ShouldBroadcastNow, ShouldBroadcast), поскольку интерфейс ShouldBroadcastNow уже расширяет ShouldBroadcast

+0

Это то, что я искал, так как я хотел, чтобы мое событие-толкатель было намного более отзывчивым, поскольку его уволили из уже поставленной очереди. – Throttlehead