Laravel广播触发报错:Pusher::trigger()第4个参数需为数组
Laravel广播触发报错:Argument 4 passed to Pusher\Pusher::trigger() must be of the type array, null given
环境与已执行操作
环境:PHP 7.4.5、Windows 10 64位、Laravel ^7.0
已完成以下配置:
- 安装
beyondcode/laravel-websockets(^1.13)和pusher/pusher-php-server(7.0/7.2)并执行composer update - 在
config/app.php中取消注释App\Providers\BroadcastServiceProvider - 修改
.env的BROADCAST_DRIVER为pusher,调整config/broadcasting.php的Pusher配置:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), // 这些环境变量已缓存为测试值 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'useTLS' => false, 'encrypted' => false, 'host' => '127.0.0.1', 'port' => '6001', 'scheme' => 'http', ], ],
- 发布websockets.php和迁移文件并执行迁移
- 创建实现
ShouldBroadcast的PlaygroundEvent事件类:
<?php namespace App\Events; use Illuminate\Broadcasting\Channel; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PresenceChannel; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class PlaygroundEvent 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('public.playground.1'); // return new PrivateChannel('channel-name'); } }
- 在
web.php路由中添加测试路由:
Route::get('/playground', function(){ event(new \App\Events\PlaygroundEvent()); return null; });
报错信息
访问测试路由时触发错误:
Argument 4 passed to Pusher\Pusher::trigger() must be of the type array, null given, called in [...]vendor\laravel\framework\src\Illuminate\Broadcasting\Broadcasters\PusherBroadcaster.php on line 113
WebSockets仪表盘正常,堆栈追踪翻译如下:
#0 [...]\vendor\pusher\pusher-php-server\src\Pusher.php(579): Pusher\Pusher->trigger() #1 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\Broadcasters\PusherBroadcaster.php(113): Pusher\Pusher->trigger() #2 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\Broadcasters\Broadcaster.php(92): Illuminate\Broadcasting\Broadcasters\PusherBroadcaster->broadcast() #3 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\BroadcastManager.php(286): Illuminate\Broadcasting\Broadcasters\Broadcaster->broadcast() #4 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\BroadcastEvent.php(67): Illuminate\Broadcasting\BroadcastManager->broadcast() #5 [...]\vendor\laravel\framework\src\Illuminate\Queue\CallQueuedHandler.php(93): Illuminate\Broadcasting\BroadcastEvent->handle() #6 [...]\vendor\laravel\framework\src\Illuminate\Queue\Jobs\SyncJob.php(43): Illuminate\Queue\CallQueuedHandler->call() #7 [...]\vendor\laravel\framework\src\Illuminate\Queue\Queue.php(124): Illuminate\Queue\Jobs\SyncJob->fire() #8 [...]\vendor\laravel\framework\src\Illuminate\Queue\QueueManager.php(244): Illuminate\Queue\Queue->push() #9 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\BroadcastManager.php(239): Illuminate\Queue\QueueManager->push() #10 [...]\vendor\laravel\framework\src\Illuminate\Broadcasting\PendingBroadcast.php(54): Illuminate\Broadcasting\BroadcastManager->queue() #11 [...]\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php(261): Illuminate\Broadcasting\PendingBroadcast->__destruct() #12 [...]\routes\web.php(26): Illuminate\Support\Facades\Facade::__callStatic() #13 [...]\vendor\laravel\framework\src\Illuminate\Routing\Route.php(219): 闭包->{closure}() #14 [...]\vendor\laravel\framework\src\Illuminate\Routing\Route.php(176): Illuminate\Routing\Route->run() #15 [...]\vendor\laravel\framework\src\Illuminate\Routing\Router.php(680): Illuminate\Routing\Route->run() #16 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}() #17 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #18 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(163): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() #19 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #20 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(63): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #21 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(163): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle() #22 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #23 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #24 [...]\vendor\laravel\framework\src\Illuminate\Routing\Router.php(682): Illuminate\Pipeline\Pipeline->then() #25 [...]\vendor\laravel\framework\src\Illuminate\Routing\Router.php(657): Illuminate\Routing\Router->runRouteWithinStack() #26 [...]\vendor\laravel\framework\src\Illuminate\Routing\Router.php(623): Illuminate\Routing\Router->runRoute() #27 [...]\vendor\laravel\framework\src\Illuminate\Routing\Router.php(612): Illuminate\Routing\Router->dispatchToRoute() #28 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(176): Illuminate\Routing\Router->dispatch() #29 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}() #30 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #31 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(163): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #32 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #33 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #34 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(163): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #35 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #36 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidateSignature.php(125): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #37 [...]\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(163): Illuminate\Foundation\Http\Middleware\ValidateSignature->handle() #38 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #39 [...]\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}() #40 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(151): Illuminate\Pipeline\Pipeline->then() #41 [...]\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() #42 [...]\public\index.php(55): Illuminate\Foundation\Http\Kernel->handle() #43 {主函数}
问题原因与解决方法
原因
Laravel 7的PusherBroadcaster与新版本pusher-php-server(7.x)不兼容,新版本trigger方法要求第4个参数为数组,但Laravel 7的广播器传递了null。
解决步骤
降级pusher-php-server版本
Laravel 7官方兼容的pusher版本为^4.0或^5.0,执行命令降级:composer require pusher/pusher-php-server:^5.0清除配置缓存
执行命令清除之前的配置缓存:php artisan config:clear重启websocket服务
停止当前websocket服务后重新启动:php artisan websockets:serve验证修复
再次访问/playground路由,检查错误是否消失。
临时兼容方案(不推荐长期使用)
在PlaygroundEvent类中添加broadcastWith方法返回空数组:
public function broadcastWith() { return []; }
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

