【问题标题】:Laravel queue event not serializing modelsLaravel 队列事件未序列化模型
【发布时间】:2018-07-29 13:47:48
【问题描述】:

不确定我是否做错了什么,但在尝试广播事件时,SerializesModels 只会序列化我扔给它的第一个模型。

class WorkerQueueEvent implements ShouldBroadcast
{
  use Dispatchable, InteractsWithSockets, SerializesModels;

  protected $user;
  public $queue;
  public function __construct(User $user,QueueJob $queue)
  {
    $this->user = $user;
    $this->queue = $queue;
  }
  public function broadcastOn()
  {    
    return new PrivateChannel('Queues/' . $this->user->id);
  }
}

这会导致队列永远不会被处理。 如果我在构造函数中执行dd($queue);dd($user);,它会同时记录它们,但它永远不会到达broadcastOn();

我确实让它工作了,传递 QueueJob id 并在广播函数上获取它,只是询问我是否做错了什么,或者这实际上是一个错误。

【问题讨论】:

    标签: php laravel laravel-echo


    【解决方案1】:

    我认为这里的问题是您的 public $queue 属性。

    The documentation 声明您可以通过定义$broadcastQueue 属性来指定事件队列。但是,它没有提到如果 $broadcastQueue 未定义,它也会检查 $queue 属性。

    由于您定义了 $queue 属性,它会尝试将您的事件推送到由您的 QueueJob 模型实例的 __toString() 值命名的队列中,我假设它不存在以及为什么您的作业永远不会发送到队列。

    如果您将您的属性重命名为 $queueJob,那么我相信它应该适合您。

    【讨论】:

    • 好像有道理,我试试看。
    • 在做一个愚蠢的解决方法之前,应该尝试查看已定义的变量或更深入地了解框架所做的事情。感谢您的回答/澄清我。
    【解决方案2】:

    对于运行队列,您必须运行 php artisan queue:work

    为此还要确保驱动程序是database,您可以将其设置为您的.env 文件。

    希望对你有帮助

    【讨论】:

    • 我得到了使用 redis 的队列,唯一的问题是,如果我传递一个两个 elequent 模型而不是一个,它永远不会到达广播功能。有更多的队列在工作,甚至还有这个,但我不能将多个模型传递给它,需要传递 id 并在广播函数中获取模型
    • 为了让这个队列正常工作,我将一个 ID 作为第二个参数传递,然后在将其返回到私人频道之前将其获取到公共属性 $queue,这样 Echo 就会返回该模型
    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多