如何修复 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
我正在按照一个教程让 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