使用 beyondcode/laravel-websockets 需要 pusher APP/KEY 吗?

Does using beyondcode/laravel-websockets need pusher APP/KEY?

实现聊天在Laravel 8/vue 2.6 我添加了beyondcode/laravel-websockets 阅读一些手册我发现我需要使用 pusher 包,比如 laravel-echo 和 pusher-js 不是 pusher App API。所以我试着在 .env 中制作:

BROADCAST_DRIVER=pusher

PUSHER_APP_ID=myId
PUSHER_APP_KEY=myKey
PUSHER_APP_SECRET=mySecret
PUSHER_APP_CLUSTER=eu

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

并在 resources/js/bootstrap.js 中:

import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
    broadcaster: 'pusher',
    key: 'myKey',
    wsHost: 601,
    disableStats: true,
    forceTLS: false
});

在 config/app.php 我取消注释行 :

 App\Providers\BroadcastServiceProvider::class,

在config/broadcasting.php :

<?php

return [

    'default' => env('BROADCAST_DRIVER', 'null'),

    'connections' => [
        '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'),
                'encrypted' => true,
                'host'      => '127.0.0.1',
                'port'      => 6001,
                'scheme'    => 'http',

                'useTLS' => false,
            ],
        ],
        'ably'   => [
            'driver' => 'ably',
            'key'    => env('ABLY_KEY'),
        ],

        'redis' => [
            'driver'     => 'redis',
            'connection' => 'default',
        ],

        'log' => [
            'driver' => 'log',
        ],

        'null' => [
            'driver' => 'null',
        ],

    ],

];

并在 routes/channels.php 中:

Broadcast::channel('chat', function ($user, $id) {
    \Log::info(  varDump($user, ' routes/channels.php -1 $user::') ); // I DO NOT SEE THESE log lines
//    return (int) $user->id === (int) $id;
    return $user;
});

并在 config/websockets.php 中:

<?php

use BeyondCode\LaravelWebSockets\Dashboard\Http\Middleware\Authorize;

return [

    'dashboard' => [
        'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001),
    ],

    'apps' => [
        [
            'id' => env('PUSHER_APP_ID'),
            'name' => env('APP_NAME'),
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'path' => env('PUSHER_APP_PATH'),
            'capacity' => null,
            'enable_client_messages' => false,
            'enable_statistics' => true,
        ],
    ],

    'app_provider' => BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class,

    'allowed_origins' => [
        //
    ],

    'max_request_size_in_kb' => 250,

    'path' => 'laravel-websockets',

    'middleware' => [
        'web',
        Authorize::class,
    ],

    'statistics' => [
        'model' => \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class,

        'logger' => BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger::class,

        'interval_in_seconds' => 60,

        'delete_statistics_older_than_days' => 60,

        'perform_dns_lookup' => false,
    ],

    'ssl' => [
        'local_cert' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_CERT', null),

        'local_pk' => env('LARAVEL_WEBSOCKETS_SSL_LOCAL_PK', null),

        'passphrase' => env('LARAVEL_WEBSOCKETS_SSL_PASSPHRASE', null),
    ],

    'channel_manager' => \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class,
];

运行 我看到的服务器:

user@os:app_path$ php artisan websockets:serve
Starting the WebSocket server on port 6001...
New connection opened for app key myKey.
Connection id 447562709.864005085 sending message {"event":"pusher:connection_established","data":"{\"socket_id\":\"447562709.864005085\",\"activity_timeout\":30}"}
...

运行WebSockets 仪表板位于

http://127.0.0.1:8000/laravel-websockets

连接成功,多条消息,

但是尝试 post 新事件时我看到错误:https://imgur.com/a/7zJZPyu

{"message":"The given data was invalid.","errors":{"data":["The data must be a valid JSON string."]}}

但是在 brwosers 控制台中我看到错误:

app.js:119179 WebSocket connection to 'ws://0.0.2.89/app/myKey?protocol=7&client=js&version=7.0.3&flash=false' failed:

它因“myKey”而失败。也许有一些选项不使用推送服务器密钥?

谢谢!

您需要确保凭据在服务器和客户端上是相同的。您在客户端中将键值设置为 PUSHER_APP_KEY=myKeyconfig/broadcasting.php 文件中使用的变量值是多少 和 config/websockets.php : key' => env('PUSHER_APP_KEY'),.

Source确保使用与广播配置部分中相同的应用程序 ID、密钥和机密。否则从 Laravel 广播事件将不起作用。

您还需要确保使用来自调试控制台的有效 JSON 负载。

Source只需输入频道、事件名称并提供有效的JSON有效载荷,即可将其发送到给定频道中所有已连接的客户端。