Symfony 5 与 Pusher 的私人聊天
Symfony 5 Private chat with Pusher
我已经使用 Symfony 5
创建了一个简单的群聊应用程序,现在我正在尝试使用 Pusher
添加 Socket
。
目前它正在运行,但因为我使用的是单个 channel
,每次用户 post 一条消息时,该消息都会出现在每次对话中。这就是为什么我想在 channel name
中传递 messaging_id
,但它不起作用。
我在文档上读到我应该在 channel name
中使用前缀 private-
,但是控制台要求我对用户进行身份验证,但我不知道该怎么做因为我的用户已经连接。
这是我的逻辑控制器:
// Pusher
$options = array(
'cluster' => 'eu',
'useTLS' => true
);
$pusher = new Pusher(
'ba75523bee28d7c644f2',
'9597b6daf0fb4e20fda2',
'1266737',
$options
);
//New message
$message = new Message();
$form = $this->createForm(MessageType::class, $message);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$message->setAuthor($user);
$message->setMessaging($messaging);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($message);
$entityManager->flush();
$data = $message->getContent();
if ($pusher->trigger('my-channel', 'my_event', $data)) {
echo 'success';
} else {
header('', true, 403);
echo 'error';
}
return new JsonResponse(Response::HTTP_OK);
}
这是我的 Javascript :
Pusher.logToConsole = true;
var pusher = new Pusher('ba75523bee28d7c644f2', {
cluster: 'eu',
});
var channel = pusher.subscribe('my-channel');
channel.bind('my_event',
function (data) {
console.log(data);
$('.lala').append('<li class = "chat-left"><div class="chat-text">' + data + '</div>');
});
channel.bind('pusher:subscription_succeeded', function (members) {
console.log('successfully subscribed!');
});
function ajaxCall(ajax_url, ajax_data) {
$.ajax({
type: "POST",
url: ajax_url,
dataType: "json",
data: ajax_data,
success: function (response) {
console.log(response);
},
error: function (msg) { }
});
}
如果我使用 private-
前缀,会出现以下错误:
enter image description here
总而言之,我希望每条消息都只出现在好的对话中(消息当然会保存在正确对话的数据库中)。
感谢您的帮助!
您没有使用私人频道让每个聊天都有一个频道,但这确实有意义 - 这将允许您确保只有用户是会员的聊天能够订阅频道(因此接收消息)。
收到的错误消息似乎表明您的身份验证端点的代码存在错误。您可以在 https://pusher.com/docs/channels/server_api/authenticating-users/.
中找到身份验证过程的详细信息和身份验证端点代码示例
如果您使用的是 PHP 库,那么生成身份验证令牌所需的代码是详细的 in the Github repo。这将需要返回以响应身份验证请求
我已经使用 Symfony 5
创建了一个简单的群聊应用程序,现在我正在尝试使用 Pusher
添加 Socket
。
目前它正在运行,但因为我使用的是单个 channel
,每次用户 post 一条消息时,该消息都会出现在每次对话中。这就是为什么我想在 channel name
中传递 messaging_id
,但它不起作用。
我在文档上读到我应该在 channel name
中使用前缀 private-
,但是控制台要求我对用户进行身份验证,但我不知道该怎么做因为我的用户已经连接。
这是我的逻辑控制器:
// Pusher
$options = array(
'cluster' => 'eu',
'useTLS' => true
);
$pusher = new Pusher(
'ba75523bee28d7c644f2',
'9597b6daf0fb4e20fda2',
'1266737',
$options
);
//New message
$message = new Message();
$form = $this->createForm(MessageType::class, $message);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$message->setAuthor($user);
$message->setMessaging($messaging);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($message);
$entityManager->flush();
$data = $message->getContent();
if ($pusher->trigger('my-channel', 'my_event', $data)) {
echo 'success';
} else {
header('', true, 403);
echo 'error';
}
return new JsonResponse(Response::HTTP_OK);
}
这是我的 Javascript :
Pusher.logToConsole = true;
var pusher = new Pusher('ba75523bee28d7c644f2', {
cluster: 'eu',
});
var channel = pusher.subscribe('my-channel');
channel.bind('my_event',
function (data) {
console.log(data);
$('.lala').append('<li class = "chat-left"><div class="chat-text">' + data + '</div>');
});
channel.bind('pusher:subscription_succeeded', function (members) {
console.log('successfully subscribed!');
});
function ajaxCall(ajax_url, ajax_data) {
$.ajax({
type: "POST",
url: ajax_url,
dataType: "json",
data: ajax_data,
success: function (response) {
console.log(response);
},
error: function (msg) { }
});
}
如果我使用 private-
前缀,会出现以下错误:
enter image description here
总而言之,我希望每条消息都只出现在好的对话中(消息当然会保存在正确对话的数据库中)。 感谢您的帮助!
您没有使用私人频道让每个聊天都有一个频道,但这确实有意义 - 这将允许您确保只有用户是会员的聊天能够订阅频道(因此接收消息)。
收到的错误消息似乎表明您的身份验证端点的代码存在错误。您可以在 https://pusher.com/docs/channels/server_api/authenticating-users/.
中找到身份验证过程的详细信息和身份验证端点代码示例如果您使用的是 PHP 库,那么生成身份验证令牌所需的代码是详细的 in the Github repo。这将需要返回以响应身份验证请求