Jaq*_*arh 5 php websocket laravel webrtc ratchet
我在Laravel.io上找到了一篇关于如何将 Laravel 会话加载到 Ratchet 中的帖子,该帖子已过时并使用 Laravel 5.4,因此我更改了一些内容以使其与 Laravel 8.x 一起使用
public function onOpen(ConnectionInterface $conn)
{
// Attach connection
$this->clients->attach($conn);
// Create a new session handler for this client
$session = (new SessionManager(App::getInstance()))->driver();
// Get the cookies
$cookiesRaw = $conn->httpRequest->getHeader('Cookie');
$cookies = [];
if(count($cookiesRaw)) {
$cookies = Header::parse($cookiesRaw)[0]; // Array of cookies
}
// Get the laravel's one - todo: try catch
$sessionId = Crypt::decrypt(urldecode($cookies[Config::get('session.cookie')]), false);
var_dump($sessionId);
// Set the session id to the session handler
$session->setId($sessionId);
// Bind the session handler to the client connection
$conn->session = $session;
var_dump($conn->session->getId());
}
Run Code Online (Sandbox Code Playgroud)
然后我也更改了发送消息,因为我收到了意想不到的结果。
public function onMessage(ConnectionInterface $conn, MessageInterface $msg)
{
$conn->session->start();
$sessionId = $conn->session->getId();
var_dump($sessionId);
if(!is_null(($decoded = json_decode(base64_decode($msg), true))) && array_diff(['message'], array_keys($decoded)))
return;
var_dump($decoded['message']);
return;
}
Run Code Online (Sandbox Code Playgroud)
我用 JS 前端测试这个:
class WebRTC
{
socket;
constants;
timerId;
constructor(protocol, fqdns, port) {
this.constants = {
protocol: protocol,
fqdns: fqdns,
port: port
};
this.listenChanges();
}
listenChanges() {
this.socket = new WebSocket(`${this.constants.protocol}://${this.constants.fqdns}:${this.constants.port}`);
this.socket.onmessage = e => {
console.log(atob(e.data));
};
this.socket.onerror = () => {
this.socket.close();
};
this.socket.onopen = () => {
console.info('Connected to WebRTC Chat Server...');
this.socket.send(btoa(JSON.stringify({
message: '{{ session()->getId() }}' // Expected session
})));
clearInterval(this.timerId);
this.socket.onclose = () => {
this.timerId = setInterval(() => {
this.listenChanges();
}, 1000);
};
};
}
}
new WebRTC('ws', '127.0.0.1', '8080');
Run Code Online (Sandbox Code Playgroud)
& 当连接打开时,我发送了session()->getId()
我需要的预期会话。但是,我在 CLI 中的输出是:
onOpen() : $sessionId
string(81) "b0e41cf0d856bdfc8427e1fdde62d5a154519f9c|MLXa9H2BbnQmySt2hRB360UANxLGHyz6iRMxGcoG"
Run Code Online (Sandbox Code Playgroud)
onOpen() : $conn->session->getId()
string(40) "qyaDOQjNFlbrbjvvKRE1m5sN0dsGqqAsoMfkeqyU"
Run Code Online (Sandbox Code Playgroud)
onMessage(): $conn->session->getId()
string(40) "qyaDOQjNFlbrbjvvKRE1m5sN0dsGqqAsoMfkeqyU"
Run Code Online (Sandbox Code Playgroud)
JS刀片格式化作为消息发送的实际会话
string(40) "MLXa9H2BbnQmySt2hRB360UANxLGHyz6iRMxGcoG"
Run Code Online (Sandbox Code Playgroud)
在这里,我预期的onMessage()
方法接收注入的依赖项$conn
(ConnectionInterface)与->session->getId()
实际的,session()->getId()
所以我可以开始Auth::user()
工作。
关于我做错了什么的任何想法?我试着var_dump($conn->session->get(Auth::getName()));
为Laravel.Io说可以做,但它的返回nullvar_dump
和我的用户正在登录。
这应该让我可以使用 User::find() 或 Auth::user()。
归档时间: |
|
查看次数: |
149 次 |
最近记录: |