В документации для Horizon упоминается, что настраиваемые теги могут быть добавлены к прослушивателям событий в очереди. Однако я не могу найти способ получить свой экземпляр события, содержащий нужные мне данные. В приведенном примере используется подсказка типа, чтобы извлечь соответствующую модель из контейнера службы и присвоить ее переменной экземпляра в конструкторе, а затем использовать эту переменную экземпляра в методе tags()
для получения данных о конкретном экземпляре модели, над которым выполняется операция.
Однако при выполнении этого в прослушивателе событий в очереди это не работает. На самом деле конструктор вообще никогда не вызывается из-за того, что модель сериализуется и «повторно гидратируется», когда дело доходит до выполнения. Таким образом, подсказка типа в конструкторе ничего не делает, и tags()
вызывается перед handle()
, поэтому я не могу получить доступ к объекту события, который я слушаю.
Кто-нибудь знает, как я могу получить информацию о событии в теге в этой ситуации?
Обновление:
Событие, вызванное в контроллере:
event(new PostWasCreated($user, $post));
Событие PostWasCreated:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\User;
use App\Post;
class PostWasCreated
{
use InteractsWithSockets, SerializesModels;
public $user;
public $post;
public function __construct(User $user, Post $post)
{
$this->user = $user;
$this->post = $post;
}
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
Прослушиватель PostWasCreatedNotificationSend:
<?php
namespace App\Listeners;
use App\Events\PostWasCreated;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class PostWasCreatedNotificationSend implements ShouldQueue
{
protected $event;
public $queue = 'notifications'; // Adds queue name
public function __construct(PostWasCreated $event)
{
$this->event = $event;
// Does NOT add queue tag
$this->queueTags = ['post: ' . $this->event->post->id];
}
public function tags()
{
return $this->queueTags;
}
public function handle(PostWasCreated $event)
{
// handle event here...
}
}
Проблема в том, что $this->queueTags
никогда не назначается, поэтому в Horizon нет тегов для этого прослушивателя в очереди... (хотя имя очереди отображается, но нам также нужны теги).
CallQueuedListener
для поиска любых тегов. Из этого описания сложно понять, что происходит. Не могли бы вы показать код события, которое вы пытаетесь поставить в очередь? Проявляет ли он чертуSerializesModels
? - person Cy Rossignol   schedule 31.03.2018