dersam/laravel-multitenant

laravel的多租户服务提供者

v0.1.2 2017-11-19 02:38 UTC

This package is auto-updated.

Last update: 2024-09-22 21:42:18 UTC


README

为Laravel提供简单的多租户服务提供者。每个租户将获得自己的数据库模式。它期望有一个独立的“核心”模式来管理应用程序的全局设置。

此服务不通过所有者列支持多租户,永远不会。

安装

安装包: composer require dersam/laravel-multitenant

运行迁移以在您的核心数据库中创建tenants数据库。 php artisan migrate

部署配置。 php artisan vendor:publish --provider="Dersam\Multitenant\ServiceProvider"

config/database.php中添加一个“虚拟”配置。它应指向您想要包含租户模式的数据库,但不要指定数据库。这将是动态设置的。

'connections' => [
    // The core database that contains global application tables.
    'core' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
    // A "dummy" database that will be pointed to the correct tenant on the fly.
    'tenant' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
    ],
],

用法

服务提供者将被自动注册 - 它可以通过Dersam\Multitenant\TenantSwitcher注入。获取您的Tenant模型,并将其传递以切换tenant连接到您的数据库。在此示例中,假定User模型有一个tenant_id列,但此包将此决定权留给开发者。

$tenant = Tenant::find($user->tenant_id);
if ($tenant === null) {
    return redirect('/');
}
$this->tenantSwitcher->switchGlobalTenant($tenant);

您可以使用Dersam\Multitenant\IsTenantModel特质指定某些模型始终使用租户连接。

namespace App\Models\Tenant;

use Dersam\Multitenant\IsTenantModel;
...

class ExampleModel extends Model
{
    use IsTenantModel;
...

您可以通过将迁移放在database/migrations/tenant目录中来指定仅在租户数据库上运行的迁移。可以使用php artisan multitenant:migrate在所有租户上运行迁移,并使用php artisan multitenant:migrate:rollback回滚迁移。这些命令将读取tenants表并自动发现相关的租户数据库。每个租户维护自己的迁移表。