Php Laravel广播,如何认证状态频道?
我正在尝试加入一个状态频道(公共频道工作得很好),但我无法让它工作: Vue代码:Php Laravel广播,如何认证状态频道?,php,laravel,websocket,laravel-echo,Php,Laravel,Websocket,Laravel Echo,我正在尝试加入一个状态频道(公共频道工作得很好),但我无法让它工作: Vue代码: mounted(){ Echo.join('game.' + "0").here((users) => { alert("In the channel!"); }) .joining((user) => { console.log(&q
mounted(){
Echo.join('game.' + "0").here((users) => {
alert("In the channel!");
})
.joining((user) => {
console.log("Someone entered");
})
.leaving((user) => {
console.log(user.name);
})
.listen('GameEvent', (e) => {
console.log("Hey")
});
Echo.channel('NewSentence')
.listen('NewSentence',(sentence)=>{
alert("HOLA");
});
}
我正在尝试加入“game.0”频道。当我使用Laravel Passport时,我需要使用令牌对自己进行身份验证,这是有效的。发送Laravel Echo的身份验证请求会返回一个键,但JavaScript事件不会触发.here()
,.listening()
广播服务提供商启动功能:
public function boot() {
Broadcast::routes(["middleware" => "auth:api"]);
require base_path('routes/channels.php');
}
Route::post('/broadcasting/auth', function(Request $request){
$pusher = new Pusher\Pusher(
env('PUSHER_APP_KEY'),
env('PUSHER_APP_SECRET'),
env('PUSHER_APP_ID'),
array(
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => false,
'host' => '127.0.0.1',
'port' => 6001,
'scheme' => 'http',
)
);
return $pusher->socket_auth($request->request->get('channel_name'),$request->request->get('socket_id'));
});
channels.php
Broadcast::channel('game.0', function ($user,$id) {
return ['id' => $user->id];
});
验证路径:
public function boot() {
Broadcast::routes(["middleware" => "auth:api"]);
require base_path('routes/channels.php');
}
Route::post('/broadcasting/auth', function(Request $request){
$pusher = new Pusher\Pusher(
env('PUSHER_APP_KEY'),
env('PUSHER_APP_SECRET'),
env('PUSHER_APP_ID'),
array(
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => false,
'host' => '127.0.0.1',
'port' => 6001,
'scheme' => 'http',
)
);
return $pusher->socket_auth($request->request->get('channel_name'),$request->request->get('socket_id'));
});
我需要做些额外的事情来让它工作吗?这是身份验证请求:
编辑:
游戏事件事件:
class GameEvent implements ShouldBroadcastNow {
use Dispatchable, InteractsWithSockets, SerializesModels;
public $gameEvent;
public $gameId;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($gameEvent, $gameId) {
//
$this->gameEvent = $gameEvent;
$this->gameId = $gameId;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\PresenceChannel|array
*/
public function broadcastOn() {
//return new PrivateChannel('channel-name');
return new PresenceChannel('game.0');
}
public function broadcastWith() {
return $this->gameEvent;
}
}
编辑:
我已经对名称进行了硬编码:“game.0”现在在routes/channels.php
route、Echo连接和GameEvent中进行了硬编码。我还删除了broadcastAs()
。进入laravel websockets调试仪表板后,我发现我想要订阅的频道甚至没有出现。看起来它不会启动连接,但我不知道发生了什么
我硬编码了这里的问题似乎是回声没有在正确的频道上收听。首先,Echo.join使用的是channel game.0,其中0是用户id,我认为实际上没有id为0的用户。第二,你是作为 游戏事件 Echo正在连接名为game的频道。{id}我建议您从事件文件中删除broadcastAs()函数,或者收听GameEvent。也可以使用websocket仪表板进行测试。仪表板将在以下位置提供: /拉维尔网袋 自动路由,这仅适用于本地环境,因此请确保环境在.env中是本地的 使用laravel websockets提供的调试仪表板向频道发送数据,首先连接仪表板中的web套接字,然后只需输入JSON格式的频道名称、事件名称和数据,然后点击仪表板上的发送。 试着找出这是否有助于解决您的问题 我还建议你彻底阅读,同时也要认真阅读。
另外,请更新此问题的结果。这里的问题似乎是回音未在正确的频道上收听。首先,Echo.join使用的是channel game.0,其中0是用户id,我认为实际上没有id为0的用户。第二,你是作为 游戏事件 Echo正在连接名为game的频道。{id}我建议您从事件文件中删除broadcastAs()函数,或者收听GameEvent。也可以使用websocket仪表板进行测试。仪表板将在以下位置提供: /拉维尔网袋 自动路由,这仅适用于本地环境,因此请确保环境在.env中是本地的 使用laravel websockets提供的调试仪表板向频道发送数据,首先连接仪表板中的web套接字,然后只需输入JSON格式的频道名称、事件名称和数据,然后点击仪表板上的发送。 试着找出这是否有助于解决您的问题 我还建议你彻底阅读,同时也要认真阅读。
同时更新您在这个问题的结果。您也可以上传您正在广播的事件文件吗?@Kuldeep post updated!你还可以上传你正在广播的事件文件吗?@Kuldeep post更新!在回答这个问题之后,我对名称进行了硬编码:“game.0”现在在
routes/channels.php
route、Echo连接和GameEvent中进行了硬编码。正如你所说,我还删除了broadcastAs()
。进入laravel websockets仪表板后,我发现我想要订阅的频道甚至没有出现。看起来它不会启动连接,但我不知道在你用更新的文件更新问题时会发生什么。。。我想你可以用仪表板解决这个问题。。。此外,有时名称空间也会出现问题。。。广播事件时请查看仪表板日志…我用这些更改更新了帖子。仪表板没有给出任何线索,通过通道发送的消息正确,并且控制台中没有显示任何错误。它只是不连接到状态通道。你说的仪表板不提供任何线索是什么意思?你能在仪表板上看到你的echo订阅了game.0频道吗?如果您可以尝试从仪表板发送事件,请检查它是否有效。。。我可以用同一个仪表板解决我的问题。不,就是这样,我看不到我的echo订阅了游戏。0频道。没有订阅该频道。在回答这个问题之后,我已经对名称进行了硬编码:“game.0”现在在routes/channels.php
route、Echo连接和GameEvent中进行了硬编码。正如你所说,我还删除了broadcastAs()
。进入laravel websockets仪表板后,我发现我想要订阅的频道甚至没有出现。看起来它不会启动连接,但我不知道在你用更新的文件更新问题时会发生什么。。。我想你可以用仪表板解决这个问题。。。此外,有时名称空间也会出现问题。。。广播事件时请查看仪表板日志…我用这些更改更新了帖子。仪表板没有给出任何线索,通过通道发送的消息正确,并且控制台中没有显示任何错误。它只是不连接到状态通道。你说的仪表板不提供任何线索是什么意思?你能在仪表板上看到你的echo订阅了game.0频道吗?如果您可以尝试从仪表板发送事件,请检查它是否有效。。。我能用同一个仪表板解决我的问题。不,是的