【问题标题】:"Argument 4 passed to Pusher\Pusher::trigger() must be of the type array, null given" when dispatching a default ShouldBroadcast Event\"Argument 4 passed to Pusher\\Pusher::trigger() must be of the type array, null given\" 在调度默认 ShouldBroadcast 事件时
【发布时间】:2023-02-25 07:11:55
【问题描述】:

我正在尝试按照本教程进行操作:https://www.youtube.com/watch?v=AUlbN_xsdXg,它非常简单明了,但不幸的是对我不起作用。基于 cmets,其他人似乎没有这个问题。

这是我到目前为止所做的:

  1. 安装了 "beyondcode/laravel-websockets": "^1.13" 和 "pusher/pusher-php-server": "7.0" (首先尝试了当前版本 7.2 但错误没有区别)并做了 composer 更新
  2. 在 config/app.php 中取消注释 App\Providers\BroadcastServiceProvider
  3. 将 .env 更改为 BROADCAST_DRIVER=pusher 并修改了 config/broadcasting.php
    'pusher' => [
                'driver' => 'pusher',
                'key' => env('PUSHER_APP_KEY'), // These env vars have config:cache'd dummy values
                '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',
                ],
            ],
    
    1. 已发布 websockets.php 和迁移文件/执行迁移
    2. 创建了虚拟事件类并添加了“implements ShouldBroadcast”
    <?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');
        }
    }
    
    1. 在我的 web.php 路由文件中添加了一个测试
    Route::get('/playground', function(){
        event(new \App\Events\PlaygroundEvent());
        return null;
    });
    
    1. 访问该页面时遇到错误:
    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
    

    如果您搜索该错误,您会发现 2 个结果都未解决。不知道在哪里提到这一点,但 WebSockets 仪表板似乎工作正常。

    环境:PHP Version 7.4.5, Windows 10 64, "laravel/framework": "^7.0", "beyondcode/laravel-websockets": "^1.13", "pusher/pusher-php-server": "7.0" and 7.2 同时尝试修复。

    由于这个错误很少,我不确定下一步该去哪里,当然除了这里。任何帮助表示赞赏,谢谢。

    编辑:堆栈跟踪:https://justpaste.it/9lwe3

【问题讨论】:

  • 很好的问题。回到你的 Laravel.log,到堆栈跟踪。供应商文件夹中的错误源自其他地方。你介意显示错误的堆栈跟踪吗?
  • @UnderDog 我已将它添加到问题的底部,谢谢。

标签: php laravel pusher laravel-websockets


【解决方案1】:

尝试向事件添加有效负载:

public function broadcastWith() {
    return [
        "foo" => "bar"
    ];
}

或者,升级到 Laravel 8+ 应该可以解决这个问题。

【讨论】:

  • 谢谢,但恐怕没有区别。如果可以避免,我宁愿不升级到 8,但我一定会记住这一点。
  • 关注这个:App\Events\PlaygroundEvent)),在堆栈跟踪中和这个:Illuminate\Queue\Queue-&gt;pushOn(NULL...,粘贴很棒,但我仍然感到困惑的是错误没有在您自己的源代码中触发。在 Laravel 的源代码中使用 dd() 就没什么可做的了。请问你为什么不升级? Laravel 8 仍然兼容 PHP 7,如果这是你的理由的话。
  • @UnderDog 这不是一个很好的理由,只是我在升级 React Native 并试图修复由此产生的数十/数百个模糊错误方面经验不佳。还升级了 RN 中的其他大型库,导致了类似的噩梦。我查看了 laravel 升级指南,它看起来确实很详尽,所以也许我不应该那么不情愿。
  • 升级到 laravel 8 确实解决了这个问题。
【解决方案2】:

你可以尝试将你的 Laravel 版本升级到至少 v8,或者你可以将你的推送器降级到可以与 Laravel 7 兼容的版本。

https://laravel.com/docs/7.x/broadcasting 的 Laravel 7 文档中,使用的 pusher-php-server 版本是 v4,您可以使用

composer require pusher/pusher-php-server "~4.0"

【讨论】:

    猜你喜欢
    • 2021-05-05
    • 1970-01-01
    • 2022-11-20
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 2022-12-26
    相关资源
    最近更新 更多