orchestra/tenanti

Laravel 的基于租户的数据库模式管理器


README

Tenanti 允许您管理 Laravel 应用程序的多租户数据模式和迁移管理器。

tests Latest Stable Version Total Downloads Latest Unstable Version License Coverage Status

版本兼容性

安装

要通过 composer 安装,请在终端中运行以下命令

composer require "orchestra/tenanti"

配置

接下来,在 config/app.php 中添加以下服务提供者。

'providers' => [

    // ...
    Orchestra\Tenanti\TenantiServiceProvider::class,
    Orchestra\Tenanti\CommandServiceProvider::class,
],

命令实用程序是通过 Orchestra\Tenanti\CommandServiceProvider 启用的。

别名

为了使开发更加容易,您可以添加 Orchestra\Support\Facades\Tenanti 别名以方便引用。

'aliases' => [

    'Tenanti' => Orchestra\Support\Facades\Tenanti::class,

],

发布配置

为了更容易配置您的租户设置,请发布配置

php artisan vendor:publish

用法

为单数据库配置租户驱动程序

打开 config/orchestra/tenanti.php 并自定义驱动程序。

<?php

return [
    'drivers' => [
        'user' => [
            'model' => App\User::class,
            'paths' => [
                database_path('tenanti/user'),
            ],
            'shared' => true,
        ],
    ],
];

您可以在配置中自定义或添加新的驱动程序。请注意,model 配置仅与 Eloquent 实例一起使用。

设置迁移自动加载

对于每个驱动程序,您还应考虑将迁移路径添加到自动加载(如果尚未定义)。为此,您可以编辑您的 composer.json

composer.json
{
    "autoload": {
        "classmap": [
            "database/tenant/users"
        ]
    }
}

设置租户模型

现在我们已经设置了配置,让我们向我们的 User 类添加一个观察者

<?php 

namespace App;

use App\Observers\UserObserver;
use Orchestra\Tenanti\Tenantor;
use Illuminate\Notifications\Notifiable;
use Orchestra\Tenanti\Contracts\TenantProvider;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements TenantProvider
{
    use Notifiable;

    /**
     * Convert to tenantor.
     * 
     * @return \Orchestra\Tenanti\Tenantor
     */
    public function asTenantor(): Tenantor
    {
        return Tenantor::fromEloquent('user', $this);
    }

    /**
     * Make a tenantor.
     *
     * @return \Orchestra\Tenanti\Tenantor
     */
    public static function makeTenantor($key, $connection = null): Tenantor
    {
        return Tenantor::make(
            'user', $key, $connection ?: (new static())->getConnectionName()
        );
    }

    /**
     * The "booting" method of the model.
     */
    protected static function boot()
    {
        parent::boot();

        static::observe(new UserObserver);
    }
}

并且您的 App\Observers\UserObserver 类应包含以下内容

<?php 

namespace App\Observers;

use Orchestra\Tenanti\Observer;

class UserObserver extends Observer
{
    public function getDriverName()
    {
        return 'user';
    }
}

控制台支持

Tenanti 包含额外的命令,帮助您在创建新模式时运行批量迁移,这些命令的使用方法类似于 php artisan migrate 命名空间中的用法。

多数据库连接设置

您也可以为每个租户设置数据库连接,而不是使用 Tenanti 与单个数据库连接。

为多数据库配置租户驱动程序

打开 config/orchestra/tenanti.php 并自定义驱动程序。

<?php

return [
    'drivers' => [
        'user' => [
            'model' => App\User::class,
            'paths' => [
                database_path('tenanti/user'),
            ],
            'shared' => false,
        ],
    ],
];

通过引入 migration 配置,您现在可以将迁移表名设置为 tenant_migrations 而不是 user_{id}_migrations

数据库连接解析器

为了使 Tenanti 能够自动解析您的多个数据库连接,我们需要设置解析器。您可以通过以下方式完成此操作

<?php namespace App\Providers;

use Orchestra\Support\Facades\Tenanti;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Tenanti::connection('tenants', function (User $entity, array $config) {
            $config['database'] = "acme_{$entity->getKey()}"; 
            // refer to config under `database.connections.tenants.*`.

            return $config;
        });
    }
}

在幕后,$config 将包含从 "database.connections.tenants"(根据第一个参数 tenants)获取的模板数据库配置。我们可以动态地修改连接配置,并返回更新后的配置,供租户使用。

设置默认数据库连接

或者,您也可以使用 Tenanti 为您的应用程序设置默认数据库连接

use App\User;
use Orchestra\Support\Facades\Tenanti;

// ...

$user = User::find(5);

Tenanti::driver('user')->asDefaultConnection($user, 'tenants_{id}');

通常,这将在中间件类中使用,当您根据 Illuminate\Http\Request 对象解析租户 ID 时。