techmobi / multidb
OctoberCMS 插件,允许将不同的数据库分配给不同的域名
This package is auto-updated.
Last update: 2024-09-10 15:09:09 UTC
README
OctoberCMS 插件,用于在不同数据库中创建 SaaS 应用程序,使其更容易管理多个客户。为了开发此插件,我重用了 OctoberCMS 自身的几个类,试图创建尽可能简单的代码。
重要 此插件仍在测试和开发阶段,使用风险自负。
需求
使用方法
安装
您可以通过 composer 安装此插件。
使用 Composer
在项目根目录下执行以下命令。
composer require techmobi/multidb
配置文件 database.php
您需要修改 config/database.php
中的文件进行一些小的更改。
... 'original' => env('DB_CONNECTION', 'mysql'), // <-- ADD THIS LINE 'connections' => [ ... //ADD THIS ARRAY 'multidb' => [ 'driver' => 'mysql', 'engine' => 'InnoDB', 'host' => env('MULTIDB_HOST', 'localhost'), 'port' => env('MULTIDB_PORT', 3306), 'database' => env('MULTIDB_DATABASE', 'database'), 'username' => env('MULTIDB_USERNAME', ''), 'password' => env('MULTIDB_PASSWORD', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'varcharmax' => 191, ], ... ] ...
多数据库设置 - 后端
要使用多数据库,您需要按照以下步骤操作。
重要 必须有一个用户可以在数据库中读取、编辑和更新数据,以及创建新的数据库。
多数据库插件
首先,导航到 设置 -> 多数据库 -> 插件设置
,在此处您可以配置数据库可能有的前缀,配置每个数据库的名称,还可以选择要为新创建的实例复制的插件。
保存更改以更新数据
添加新的主机多数据库
导航到 设置 -> 多数据库 -> 主机
,在此处您可以添加新的数据库并列出要使用的域名。此时出现多站关系。通过此配置,可以识别根据访问的每个域名来识别数据库。
在 PHP 代码中使用
完成上述配置后,需要编辑插件的模型。
使用 UsesMultiConnection 特性
此特性负责管理将保存在数据库中的数据。需要将以下特性添加到所有具有复制数据库的模型中,例如以下示例
class Product extends Model { use \Techmobi\Multidb\Traits\UsesMultiConnection; ... }
使用 UsesMainConnection 特性
此特性允许您将主数据库中的表与子数据库相关联,例如,您有一个客户插件,此插件使用 UsesMultiConnection 特性,但是您有一个核心插件,该插件有一个国家模型,此插件您不复制,但是您需要将客户表的 country_id
属性与国家表相关联,在这种情况下会出现错误,因为 MultiDB 临时更改连接,因此为了避免问题,您需要在模型 Country 中添加以下特性。
class Product extends Model { use \Techmobi\Multidb\Traits\UsesMainConnection; ... }
附加功能:与多数据库一起使用多文件
如果您想要将文件保存到新的数据库中,您需要使用模型 Techmobi\Multidb\Models\File
,例如以下使用方法
class Product extends Model { use \Techmobi\Multidb\Traits\UsesMultiConnection; ... public $attachMany = [ 'images' => [ 'Techmobi\Multidb\Models\File', 'softDelete' => true, ], ]; ... }
媒体库
目前我无法创建一个管理媒体库的类,但是您可以通过在文件 System\Classes\MediaLibrary
中添加以下代码来更改文件
class MediaLibrary { use \October\Rain\Support\Traits\Singleton; use \Techmobi\Multidb\Traits\UsesMultiConnection; ... protected function init() { $this->getDomainData(); if (!empty($this->getDatabaseName())) { $this->storageFolder = "/{$this->getDatabaseName()}/media"; $this->storagePath = "/storage/app/{$this->getDatabaseName()}/media"; } else { $this->storageFolder = self::validatePath(Config::get('cms.storage.media.folder', 'media'), true); $this->storagePath = rtrim(Config::get('cms.storage.media.path', '/storage/app/media'), '/'); } $this->ignoreNames = Config::get('cms.storage.media.ignore', FileDefinitions::get('ignoreFiles')); $this->ignorePatterns = Config::get('cms.storage.media.ignorePatterns', ['^\..*']); $this->storageFolderNameLength = strlen($this->storageFolder); } ... }
更改模式事件
已添加一个事件来强制更改数据库模式,它是如何工作的?想象您已经创建了多个数据库,但是您不希望在每个 URL 上连接,因此实现了一个数据库会话,下面是一个事件,您可以将模式传递给它。
Event::fire('techmobi.schema.set', 'my_awesome_schema');