sommer/wn-multidb-plugin

WinterCMS 管理多个数据库的插件

安装: 5

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:winter-plugin

1.0.3 2024-08-23 13:22 UTC

This package is auto-updated.

Last update: 2024-09-20 05:52:47 UTC


README

WinterCMS 插件,用于在不同的数据库中创建 SaaS 应用程序,简化了多个客户的管理。为了开发此插件,我重用了 WinterCMS 本身的一些类,试图创建尽可能简单的代码。

重要 此插件仍在测试和开发阶段,请自行承担风险使用。

用法

安装

您可以通过 composer 安装此插件。

使用 Composer

在项目根目录下执行以下命令。

composer require sommer/wn-multidb-plugin

多数据库设置 - 后端

要使用多数据库,您需要按照以下步骤操作。

重要 必须有一个用户在数据库中,该用户可以读取、编辑和更新数据,以及创建新的数据库。

配置 .env

这是可选的,但如果您想要配置来自租户的另一个连接的数据,您可以将 Multidb 放在 .env 中。如果不填写任何内容,它将自动假设来自您在 DB_* 中使用的主要数据库服务器的访问数据。

MULTIDB_CONNECTION=multidb
MULTIDB_HOST=127.0.0.1
MULTIDB_PORT=3306
MULTIDB_DATABASE=my_base
MULTIDB_USERNAME=root
MULTIDB_PASSWORD=

多数据库插件

首先导航到 设置 -> 多数据库 -> 插件设置,在此处您可以配置数据库可能具有的前缀,配置每个数据库的名称,还可以选择将哪些插件复制到新创建的实例。

保存更改以更新数据

在 PHP 代码中使用

在完成上述配置后,需要编辑插件的模型。

Trait UsesTenantConnection

此特质负责管理将保存到数据库中的数据。将需要将以下特质添加到所有具有复制数据库的模型中,例如以下示例

class Product extends Model
{
	use \Sommer\Multidb\Traits\UsesTenantConnection;

	...
}

Trait UsesMainConnection

此特质允许您将主数据库中的表与子数据库相关联,例如,您有一个客户插件,此插件使用 UsesTenantConnection 特质,但是您有一个核心插件,它有一个国家模型,此插件您没有复制,但您需要将客户表中的 country_id 属性与国家表相关联,在这种情况下会有错误,因为 MultiDB 会临时更改连接,因此为了避免问题,您需要在您的模型 Country 中添加以下特质。

class Product extends Model
{
    use \Sommer\Multidb\Traits\UsesMainConnection;

    ...
}

行为

TenantSelectionBehavior

将 TenantSelectionBehavior 类添加到控制器中,将允许用户在选择访问此控制器(如果他们之前没有选择)后选择一个租户。在此点,此行为在用户图像旁边添加了一个按钮到导航菜单,允许他们更改选择的租户。

class Summaries extends Controller
{
    /**
     * @var array
     */
    public $implement = [
        'Backend\Behaviors\ListController',
        'Backend\Behaviors\FormController',
        'Sommer\MultiDB\Behaviors\TenantSelectionBehavior', // <-- add this line
    ];
}

模型辅助工具

文件

如果您想在新的数据库中保存文件,您需要使用模型 Sommer\Multidb\Models\File,例如使用

class Product extends Model
{
	use \Sommer\Multidb\Traits\UsesTenantConnection;

	...

	public $attachMany = [
        'images' => [
            'Sommer\Multidb\Models\File',
            'softDelete' => true,
        ],
    ];

    ...
}