如何修复 Laravel 在尝试广播新事件时抛出 FatalThrowableError

How to fix Laravel throwing FatalThrowableError when trying to broadcast a new event

我正在按照一个教程让 Laravel 进行实时广播,但在跟随几分钟后就卡住了。 Laravel 向我抛出以下消息“传递给 Illuminate\Database\Grammar::parameterize() 的参数 1 必须是数组类型,整数给定,在 /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar 中调用。php 第 775 行 "

我试过多次重做教程以确保我没有遗漏任何东西,但在多次尝试后问题仍然存在。 即使检查堆栈跟踪和文档也没有给我任何线索。

我已取消注释 config/app.php 中的以下行:

App\Providers\BroadcastServiceProvider::class,

我已将以下行添加到 App\Providers\EventServiceProvider:

use App\Events\RideCreated;
use App\Listeners\RideCreatedListener;

protected $listen = [ 之后在同一文件中的以下内容

    RideCreated::class => [
        RideCreatedListener::class,
    ],

这是用于测试的路由设置(web.php):

Route::get('/test', function(){
    event(new RideCreated());
    return "test";
});

这就是 RideCreated.php 的样子:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

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

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('RideCreated');
    }
}

监听器(RideCreatedListener.php)看起来像这样:

<?php

namespace App\Listeners;

use App\Events\RideCreated;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class RideCreatedListener
{

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  RideCreated  $event
     * @return void
     */
    public function handle(RideCreated $event)
    {
        //
    }
}

我希望在访问 /test 路径时在屏幕上看到测试,但实际上却显示了错误消息。

我的第一个想法是 RideCreated.php 中的 ShouldBroadcast 实现以某种方式导致了问题,因为删除 implement ShouldBroadcast 会使错误消失。唯一的问题是删除它是不可能的,因为 Pusher 需要它才能工作。

这听起来可能很奇怪,但我们一直在解决这个问题。我的回答仅供可能阅读本文的其他人使用。

事实证明,队列未配置为默认队列可以由 Laravel 解析。通过将 $bradcastQueue 属性 添加到 RideCreated class 来修复错误。参见 Broadcast Queue