【发布时间】:2017-10-03 18:47:54
【问题描述】:
- Laravel 版本:5.3.*
- PHP 版本:5.6.17
- 数据库驱动程序和版本: mysql
说明:
根据 Laravel 5.3 文档,在私有或在线频道上广播事件时,在 BroadcastServiceProvider 的启动方法中,必须提供一个回调来解决用户是否有权收听该频道的广播门面方法 @987654323 @。此方法应返回一个布尔值。在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" 并在 pusher 中创建了一个帐户。
我把我的推送凭证放在.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']]); 我能够解决问题。
ThisLaravel issue 也帮助我掌握了这个东西。
【问题讨论】:
-
加前缀的时候在JS端接收事件吗?
-
@yazfield 是的,我愿意。
标签: php laravel pusher broadcasting