学习Laravel
事件广播/ Echo
/ Vue
并使用this tutorial。
我不断收到403
个身份验证回复,我怀疑我对channels.php
路由缺乏了解是个问题。我使用Player
模型而不是User
用于Auth
哪个正常。
活动ChatMessageSend
class ChatMessageSent implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $channel;
public $player;
public $chatMessage;
/**
* Create a new event instance.
* GameChat constructor.
* @param $chatMessage
* @param $player
*/
public function __construct(ChatMessage $chatMessage, Player $player)
{
$this->channel = session()->get('chat.channel');
$this->chatMessage = $chatMessage;
$this->player = $player;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel($this->channel);
}
}
监听器ChatMessageNotification
(默认/空)
class ChatMessageNotification
{
/**
* ChatMessageNotification constructor.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param ChatMessageSent $event
* @return void
*/
public function handle(ChatMessageSent $event)
{
//
}
}
Controller ChatController
class ChatController extends Controller
{
/**
* Send chat message
*
* @param Request $request
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public function getMessages(Request $request)
{
return ChatMessage::with('player')
->where('progress_id', '=', session('game.progress.id'))
->orderBy('created_at', 'DESC')
->get();
}
/**
* Send chat message
*
* @param Request $request
* @return array|string
*/
public function sendMessage(Request $request)
{
$player = Auth::user();
$message = $request->input('message');
if ($message) {
$message = ChatMessage::create([
'player_id' => $player->id,
'progress_id' => session()->get('game.progress.id'),
'message' => $request->input('message')
]);
}
broadcast(new ChatMessageSent($player, $message))->toOthers();
return ['type' => 'success'];
}
}
路线channels.php
Broadcast::channel(session()->get('chat.channel'), function ($player, $message) {
return $player->inRoom();
});
在我的Player
班级
/**
* A user can be in one chat channel
*/
public function inRoom()
{
if ((Auth::check()) and ($this->games()->where('progress_id', '=', session('game.progress.id'))->get())) {
return true;
}
return false;
}
当玩家登录时,我会在会话中存储我想用作频道的聊天室ID。
我的vue
聊天实例
Vue.component('chat-messages', require('./../generic/chat-messages.vue'));
Vue.component('chat-form', require('./../generic/chat-form.vue'));
const app = new Vue({
el: '#toolbar-chat',
data: {
messages: []
},
created() {
this.fetchMessages();
Echo.private(chat_channel)
.listen('chatmessagesent', (e) => {
this.messages.unshift({
message: e.data.message,
player: e.data.player.nickname
});
});
},
methods: {
fetchMessages() {
axios.get(chat_get_route)
.then(response => {
this.messages = response.data;
});
},
addMessage(message) {
this.messages.unshift(message);
this.$nextTick(() => {
this.$refs.toolbarChat.scrollTop = 0;
});
axios.post(chat_send_route, message)
.then(response => {
console.log(response.data);
});
}
}
});
但我一直在
POST http://my-games.app/broadcasting/auth 403 (Forbidden)
Pusher : Couldn't get auth info from your webapp : 403
答案 0 :(得分:2)
使用Laravel版本的错误403 / broadcast / auth> 5.3& Pusher,您需要使用
更改 resources / assets / js / bootstrap.js 中的代码window.Echo = new Echo({
broadcaster: 'pusher',
key: 'your key',
cluster: 'your cluster',
encrypted: true,
auth: {
headers: {
Authorization: 'Bearer ' + YourTokenLogin
},
},
});
在 app / Providers / BroadcastServiceProvider.php 中更改
Broadcast::routes()
与
Broadcast::routes(['middleware' => ['auth:api']]);
或
Broadcast::routes(['middleware' => ['jwt.auth']]); //if you use JWT
它对我有用,希望对你有帮助。
答案 1 :(得分:0)
确定您的routes / channels.php文件是否按预期执行可能是一个想法。也许添加一些日志记录以查看是否完全调用该路由,并且您的inRoom函数正在返回您期望的内容。
答案 2 :(得分:0)
万一仍然有人需要答案,这对我有用。 添加到您的broadcastServiceProvider.php
Broadcast::routes([
'middleware' => 'auth:api']);
添加到您的channels.php
Broadcast::channel('chat', function () {
return Auth::check();
});