3 回答

TA貢獻1816條經(jīng)驗 獲得超4個贊
您可以將庫復制到項目目錄中并在以下位置設置路徑composer.json:
? ? "repositories": [
? ? ? ? {
? ? ? ? ? ? "type": "path",
? ? ? ? ? ? "url": "path-to-the-copy-of-the-library"
? ? ? ? }
? ? ],
或者您可以創(chuàng)建另一個存儲庫并分叉該庫并再次編輯composer.json:
? ? "repositories": [
? ? ? ? {
? ? ? ? ? ? "type": "vcs",
? ? ? ? ? ? "url": "URL-to-your-repository"
? ? ? ? }
? ? ],
確保您的庫符合要求:
? ? "require": {
? ? ? ? "beyondcode/laravel-websockets": "*",
? ? }
然后運行composer install

TA貢獻1890條經(jīng)驗 獲得超9個贊
需要一些時間來解決這個問題,但現(xiàn)在我找到了一個答案,最小化了供應商代碼的覆蓋。
感興趣的文件位于 Channels 文件夾下方:
|-- laravel-websockets
| |-- src
| | |-- WebSockets
| | | |-- Channels
| | | | |-- ChannelManagers
| | | | |-- ArrayChannelManager.php
| | | |-- Channel.php
| | | |-- ChannelManager.php
| | | |-- PresenceChannel.php
| | | |-- PrivateChannel.php
在 中Channel.php,PresenceChannel.php所有PrivateChannel.php推送服務器相關事件均得到處理。例如,訂閱和發(fā)送消息。該類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...函數(shù),然后解析內容以對服務器的某些客戶端命令做出反應。
以通用方式重載函數(shù),因此可以更新供應商代碼,而無需用重載破壞它。

TA貢獻1993條經(jīng)驗 獲得超6個贊
你不需要覆蓋任何東西,你的 laravel 后端將向 websockets 服務器發(fā)出一個事件,websockets 服務器將在相應的通道中將事件發(fā)送回你的前端
- 3 回答
- 0 關注
- 225 瀏覽
添加回答
舉報