You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

解决步骤

  1. 降级pusher-php-server版本
    Laravel 7官方兼容的pusher版本为^4.0或^5.0,执行命令降级:

    composer require pusher/pusher-php-server:^5.0
    
  2. 清除配置缓存
    执行命令清除之前的配置缓存:

    php artisan config:clear
    
  3. 重启websocket服务
    停止当前websocket服务后重新启动:

    php artisan websockets:serve
    
  4. 验证修复
    再次访问/playground路由,检查错误是否消失。

临时兼容方案(不推荐长期使用)

在PlaygroundEvent类中添加broadcastWith方法返回空数组:

public function broadcastWith()
{
    return [];
}

内容的提问来源于stack exchange,提问作者Bryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:35:25