如何解决如何扩展laravel websockets服务器通过BeyondCode直接触发laravel事件?
我研究了很长时间,据我了解,从laravel基本应用程序查看,BeyondCode触发websockets服务器触发的websocket事件只是单向消息传递。
消息可以从laravel基本应用程序发送到客户端(客户端对消息做出反应)。尚未实现将其他Websocket客户端的事件发送到Websocket服务器,而我的laravel基本应用对此做出反应(触发事件)。
要在我的laravel基本应用上触发事件,可以使用Webhooks 。这是对通用生成路由的标准http请求。
我明白这个意思吗?
如果我的laravel基本应用程序无法接收消息/事件,为什么我有一个websocket服务器?为什么在这种情况下我只能使用websockets?
我仍然是幼稚的新手。我想更改/覆盖某些类,看BeyondCode\LaravelWebSockets\WebSockets\Channels\Channel
,以使某些通道在正确的套接字发送正确的事件时触发事件。
如何在不干扰BeyondCode的websocket包的情况下用自己的类覆盖BeyondCode\LaravelWebSockets\WebSockets\Channels\Channel
类?我不想接触供应商的东西。
Websocket服务器是完全独立的还是可以从服务器类中访问我的基本应用程序?如果这样做,我需要牢记什么?
解决方法
您可以复制项目目录中的库并在您的 composer.json
中设置路径:
"repositories": [
{
"type": "path","url": "path-to-the-copy-of-the-library"
}
],
或者您可以创建另一个存储库并分叉库并再次编辑composer.json
:
"repositories": [
{
"type": "vcs","url": "URL-to-your-repository"
}
],
确保您在要求中拥有该库:
"require": {
"beyondcode/laravel-websockets": "*",}
然后运行composer install
您可以在这里找到更多信息或不同的解决方案: https://getcomposer.org/doc/05-repositories.md
,您不需要覆盖任何内容,您的laravel后端将向Websockets服务器发送一个事件,并且Websockets服务器会将事件发送回相应通道中的前端
,需要一些时间来解决这个问题,但现在我找到了一个对供应商代码覆盖最少的答案。
感兴趣的文件位于 Channels 文件夹下方:
|-- laravel-websockets
| |-- src
| | |-- WebSockets
| | | |-- Channels
| | | | |-- ChannelManagers
| | | | |-- ArrayChannelManager.php
| | | |-- Channel.php
| | | |-- ChannelManager.php
| | | |-- PresenceChannel.php
| | | |-- PrivateChannel.php
在 Channel.php
、PresenceChannel.php
和 PrivateChannel.php
中,处理所有推送服务器相关事件。比如订阅和发送消息。类 ArrayChannelManager
控制用于 PrivateChannel、PresenceChannel 和 Channel 的类。
Laravel-websockets 使您可以为您的项目使用自己的频道管理器,在 /config/websockets.php -> 'channel_manager'
中指定。
为了将 Laravel 事件添加到推送服务器事件,我重载了 ArrayChannelManager
和 PrivateChannel
(如果需要,您也可以重载其他频道)并添加 Laravel 排队事件。在 /config/websockets.php
中,我将重载类用作 channel_manager。
/config/websockets.php:
'channel_manager' => \App\Lib\Overwrite\LaravelWebsockets\ArrayChannelManager::class,
我重载的 ArrayChannelManager:
<?php
namespace App\Lib\Overwrite\LaravelWebsockets;
use BeyondCode\LaravelWebSockets\WebSockets\Channels\Channel;
use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManager;
use BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager as ArrayChannelManagerBase;
use BeyondCode\LaravelWebSockets\WebSockets\Channels\PresenceChannel;
use App\Lib\Overwrite\LaravelWebsockets\PrivateChannel;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Ratchet\ConnectionInterface;
class ArrayChannelManager extends ArrayChannelManagerBase
{
protected function determineChannelClass(string $channelName): string
{
if (Str::startsWith($channelName,'private-')) {
return PrivateChannel::class;
}
if (Str::startsWith($channelName,'presence-')) {
return PresenceChannel::class;
}
return Channel::class;
}
};
在我重载的 PrivateChannel
文件中,我将 MyPusherLaravelEvent
挂接到推送器订阅事件:
<?php
namespace App\Lib\Overwrite\LaravelWebsockets;
use BeyondCode\LaravelWebSockets\WebSockets\Channels\PrivateChannel as PrivateChannelBase;
use Ratchet\ConnectionInterface;
use stdClass;
class PrivateChannel extends PrivateChannelBase
{
public function subscribe(ConnectionInterface $connection,stdClass $payload)
{
parent::subscribe($connection,$payload);
\App\Events\MyPusherLaravelEvent::dispatch($this->channelName);
}
}
使用 Laravel 排队事件将事件处理与推送服务器分开是很重要的。 https://laravel.com/docs/8.x/events#queued-event-listeners
您还可以将您的事件挂接到 Channel::broadcast...
函数,然后解析内容以对您的服务器的某些客户端命令做出反应。
以通用方式重载函数,这样就可以更新供应商代码,而无需因重载而破坏它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。