Частный канал вещания Laravel не работает - PullRequest
0 голосов
/ 08 декабря 2018
ProfileUpdated.php:
class ProfileUpdated implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $data;

    public function __construct()
    {
        $this->data = [
            'power'=> '10'
        ];
    }

    public function broadcastOn()
    {
        return new PrivateChannel('test-channel');
    }
}

bootstrap.js:
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':3000',
    authEndpoint: 'http://localhost/sock/public/broadcasting/auth',
    auth: {
        headers: {
            Authorization: 'Bearer ' + '123456',
        },
    },
});

channels.php:
Broadcast::channel('test-channel.{id}', function ($user, $id) {
    return true;
});

views/layouts/master.blade.php:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FiveOne Socket.io</title>
    <meta name="csrf-token" content="{{ csrf_token() }}">
</head>
<body>
@yield('content')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="{{ asset('js/app.js') }}"></script>
@yield('footer')
</body>
</html>

views/layouts/test.blade.php:
@extends('layouts.master')
@section('content')
    <p id="power">0</p>
@stop
@section('footer')
    {{-- <script src="{{ asset('js/socket.io.js') }}"></script> --}}
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
    <script>
        window.Echo.private('test-channel.1')
            .listen('ProfileUpdated', (message) => {
                console.log(message);
                $('#power').text(parseInt($('#power').text()) + parseInt(message.data.power));
        });
    </script>
@stop

laravel-echo-server.js:
{
    "authHost": "http://localhost",
    "authEndpoint": "/broadcasting/auth",
    "clients": [
        {
            "appId": "16d858df454bc9ca",
            "key": "2b2a5e635e336904671891632b15db3d"
        }
    ],
    "database": "redis",
    "databaseConfig": {
        "redis": {},
        "sqlite": {
            "databasePath": "/database/laravel-echo-server.sqlite"
        }
    },
    "devMode": true,
    "host": null,
    "port": "3000",
    "protocol": "http",
    "socketio": {},
    "sslCertPath": "",
    "sslKeyPath": "",
    "sslCertChainPath": "",
    "sslPassphrase": "",
    "subscribers": {
        "http": true,
        "redis": true
    },
    "apiOriginAllow": {
        "allowCors": true,
        "allowOrigin": "*",
        "allowMethods": "*",
        "allowHeaders": "*"
    }
}

config/app.php:
App\Providers\BroadcastServiceProvider::class, // is commented out

web.php:
Route::get('fire', function () {
    event(new App\Events\ProfileUpdated());
    return "event fired";
});

Route::get('test', function () {
    return view('test');
});

.env:
BROADCAST_DRIVER=redis

Это все мои файлы, связанные с laravel / event / broadcast / redis / socket.io / laravel echo.Когда я запускаю laravel-echo-server start в консоли, он возвращает сообщение об ошибке: Sending auth request to: http://localhost/broadcasting/auth BpCgX4rFE2tf2CwRAAAA could not be authenticated to private-test-channel.1.Как я могу это исправить?localhost не так там?Должен ли я иметь маршрут для broadcasting/auth?У меня должен быть определенный порт для этого?Что там есть?если это аутентификация пользователя, поэтому я возвратил true в routes/channels.php.

Обратите внимание, что я не использовал аутентификацию по умолчанию для laravel с php artisan make:auth.

Кстати, это не таквозникли проблемы и работают нормально при использовании публичного канала.

ОБНОВЛЕНИЕ Я отредактировал laravel-echo-server.js с:

"authHost": "http://localhost",
"authEndpoint": "/broadcasting/auth",

до:

"authHost": "http://localhost/sock/public",
"authEndpoint": "/broadcasting/auth",

и создал новый маршрут:

Route::any('/broadcasting/auth', function () {
    return 'true';
});

, и он вернул:

-G8OS2X2BnBPWLnSAAAC authenticated for: private-test-channel.1
-G8OS2X2BnBPWLnSAAAC joined channel: private-test-channel.1

при запуске laravel-echo-server start и вернул:

Channel: private-test-channel
Event: App\Events\ProfileUpdated

при открытииhttp://localhost/sock/public/fire.

Но теперь проблема в том, что здесь не выводится полученное значение:

window.Echo.private('private-test-channel.1')
    .listen('ProfileUpdated', (message) => {
        console.log(message); // HERE it doesn't print the message in console!
        $('#power').text(parseInt($('#power').text()) + parseInt(message.data.power));
    });

ОБНОВЛЕНИЕ 2

IВы загрузили и установили Laravel-Realtime-Chat с github, и снова это работает для набора текста, который находится на общедоступном канале, но он не отправляет сообщение даже в публичном / приватном чате в режиме реального времени.Так что, похоже, проблема с моим ПК / Laravel / Firewall.Как я могу преодолеть эту проблему?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...