techmobi/multidb

OctoberCMS 插件,允许将不同的数据库分配给不同的域名

安装: 277

依赖项: 0

建议者: 0

安全: 0

星标: 2

关注者: 1

分支: 4

类型:october-plugin

v1.0.7 2021-02-03 18:12 UTC

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');