3 回答
TA贡献1816条经验 获得超4个赞
您可以将库复制到项目目录中并在以下位置设置路径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
TA贡献1890条经验 获得超9个赞
需要一些时间来解决这个问题,但现在我找到了一个答案,最小化了供应商代码的覆盖。
感兴趣的文件位于 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文件中,我将 a 挂钩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...函数,然后解析内容以对服务器的某些客户端命令做出反应。
以通用方式重载函数,因此可以更新供应商代码,而无需用重载破坏它。
TA贡献1993条经验 获得超5个赞
你不需要覆盖任何东西,你的 laravel 后端将向 websockets 服务器发出一个事件,websockets 服务器将在相应的通道中将事件发送回你的前端
- 3 回答
- 0 关注
- 168 浏览
添加回答
举报