Согласно документации Laravel 5.3 при трансляции событий по частным каналам или каналам присутствия, в методе загрузки BroadcastServiceProvider
необходимо предоставить обратный вызов, который разрешает, если у пользователя есть полномочия прослушивать этот канал для метода фасадного вещания channel
, Этот метод должен возвращать логическое значение. В BroadcastServiceProvider
метод boot
мы должны также включить Broadcast::routes()
это определит маршрут авторизации, который клиент будет вызывать для проверки разрешения на канале. Этот метод маршрутов может получить массив атрибутов для применения к маршруту. Теперь это где-то странно. Когда клиент вызывает этот маршрут, независимо от того, какой обратный вызов я передал Broadcast::channel
метод, это даст мне 403 запрета, если (и теперь наступает самая странная часть) я не предоставлю массив для Broadcast::routes
с ключом по имени prefix
и значение чего угодно. Если ключ не является префиксом, он вернется к 403 запрету.
HttpException в строке PusherBroadcaster.php 42:
Моя настройка следующая. Я точно делаю что-то не так, но после многих наших попыток понять, я не могу понять это. Может кто-нибудь дать подсказку?
Я создал простое событие:
<?php
namespace App\Events;
use App\Models\Presentation;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class PresentationCreated implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $presentation;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Presentation $presentation)
{
$this->presentation = $presentation;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('presentation');
}
}
что я вызываю, звоня event(new PresentationCreated($presentation));
Я установил "pusher/pusher-php-server": "^2.5.0"
и создал аккаунт в пушере.
Я положил свои полномочия толкателя в .env
:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=*****
PUSHER_APP_KEY=*****************
PUSHER_APP_SECRET=****************
PUSHER_APP_CLUSTER=**
в моем config\broadcast.php
Я имею:
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => 'eu',
'encrypted' => true,
],
],
Моя клиентская сторона:
this.Echo = new Echo({
broadcaster: 'pusher',
key: typeof handover.pak !== 'undefined' ? handover.pak : '',
cluster: 'eu'
});
this.Echo.private(`presentation`)
.listen('PresentationCreated', (e) => {
console.log(e, 'raposa')
});
И, наконец, BroadcastServiceProvider:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
//The commented line would make the authorization pass even if I return false bellow
//Broadcast::routes(['prefix' => 'I do not know what I am doing']);
/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('presentation', function ($user) {
return false;
});
}
}
РЕДАКТИРОВАТЬ
Благодаря ответу @yazfield я смог понять, что происходит. Ошибка http произошла из-за $request->user()
быть нулевым Это было потому, что я не передавал дополнительное промежуточное ПО, которое использовало мое пространство имен маршрута. При выполнении Broadcast::routes(['middleware' => ['web', 'clumsy', 'admin-extra']]);
Я смог решить проблему.
это Проблема Laravel также помогла мне понять эту вещь.
Давая параметр routes
вы устанавливаете атрибуты маршрутов и переопределяете атрибуты, которые по умолчанию 'middleware' => ['web']
Это означает, что вы не используете какое-либо промежуточное веб-программное обеспечение, когда вы предоставляете какой-либо массив без middleware
атрибут, вы не проверяете crsfToken … и т. д.
Других решений пока нет …