根据Laravel 5.3文档在私有或在线信道上广播事件时,在BroadcastServiceProvider
的引导方法中必须提供一个回调,如果用户有权监听该频道到广播外观方法channel
。此方法应返回布尔值。在BroadcastServiceProvider
方法boot
中,我们还应该包含Broadcast::routes()
,它将定义客户端将调用以检查通道权限的身份验证路由。此路由方法可以接收要应用于路由的属性数组。现在它变得奇怪了。当客户端调用此路由时,无论我传递给Broadcast::channel
方法的回调是什么,它都会给我一个403禁止,除非(现在是最怪异的部分)我用一个键为Broadcast::routes
提供一个数组名为prefix
和任何值的值。如果密钥不是前缀,则将返回403禁止。
PusherBroadcaster.php第42行中的HttpException:
我的设置如下。我肯定做错了什么但经过我们很多人试图理解后我无法弄明白。有人可以提示吗?
我创建了一个简单的事件:
<?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']]);
,我能够解决问题。
This Laravel问题也帮助我掌握了这件事。
答案 0 :(得分:3)
通过向routes
提供参数,您可以设置路由属性并覆盖默认为'middleware' => ['web']
的属性,这基本上意味着您在使用任何网络中间件时都不会你给任何没有middleware
属性的数组,你没有验证crsfToken ......等等。