ollieread/laravel-multitenancy

此包已被废弃且不再维护。未建议替代包。

2.2.4 2017-04-03 12:09 UTC

This package is not auto-updated.

Last update: 2022-02-01 13:04:50 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

Laravel多租户包,使用子域名和/或域名识别。该包的工作方式与默认Auth库非常相似。

安装

首先,您需要将此包包含到您的composer.json文件中。

"require": {
    "ollieread/laravel-multitenancy": "^2"
}

现在,您可以使用composer更新或安装。

composer update

接下来,打开app/config/app.php文件,并添加以下内容。

Ollieread\Multitenancy\ServiceProvider::class,

然后是外观。

'Multitenancy' => Ollieread\Multitenancy\Facades\Multitenancy::class,

最后,运行以下命令以发布配置。

php artisan vendor:publish --provider=Ollieread\Multitenancy\ServiceProvider

配置

配置有三个主要部分。

#####提供者

'provider'      => 'eloquent',

默认情况下,这可以是eloquentdatabase。如果您添加了自定义提供者,请在这里使用其名称。

#####域名

'domain'        => env('MULTITENANCY_DOMAIN', 'mydomain.com'),

应用于基于租户的子域的域名。

#####提供者设置

'eloquent'      => [
    // The model representing a tenant
    'model'         => Ollieread\Multitenancy\Models\Tenant::class
],

'database'      => [
    // The table where tenants are stored
    'table'         => 'tenants',
    // The foreign key for identifying tenant ownership
    'foreign_key'   => 'tenant_id',
    // The identifiers used to identify a tenant
    'identifiers'   => [
        'slug', 'domain'
    ]
]

这些特定设置由各个提供者定义,默认值包含简短描述。

当前租户

通过使用Multitenancy::tenant()访问当前已识别的租户。

租户路由

有一种方法可以创建应该属于租户系统的路由组。

Multitenancy::routes(function (Router $router) {
    $router->get('/tenancy', function() {
        $tenant = Multitenancy::tenant();
        dd($tenant);
    });
});

值得注意的是,如果此方法在具有默认web组的组内部调用,将会出错。您应该将web组的路由包裹在此处,例如

protected function mapWebRoutes()
{
    Multitenancy::routes(function (Router $router) {
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    });
}

如果您希望使用自己的路由组,只需确保在任何与身份验证相关的中间件之前加载以下中间件。

Ollieread\Multitenancy\Middleware\LoadTenant

要为基于租户的路由生成URL,可以使用以下方法

Multitenancy::route($name, $paramaters = [], $absolute = false);
Multitenancy::url($path, $paramaters = [], $secure = false);

这些方法的行为与route()url()相同,除了它们自动为当前租户添加正确的域名。注意:目前已移除url()方法,因为它没有完全按照预期工作。

Eloquent

如果使用Eloquent提供者,指定的模型必须实现

Ollieread\Multitenancy\Contracts\Tenant

有一个可用特质,它使用默认列名slugdomain提供实现。它还提供了对模型上的route()url()的访问。此特质是

Ollieread\Multitenancy\Traits\Tenant

作用域

有一个可用于在属于租户的模型上使用的作用域。要使用此作用域,请将以下特质添加到您希望属于租户的模型中

Ollieread\Multitenancy\Traits\TenantOwned

此方法仅适用于具有租户外键作为列的模型,旨在防止您必须在每个地方手动添加WHERE子句。

如果您想查看所有条目,无论当前租户如何,请使用 withAll() 方法。

多数据库

如果您想使用多数据库多租户方法(每个租户都有自己的数据库),您可以使用此包实现。

配置

在数据库配置文件中创建一个基础配置。例如,复制 mysql 连接信息,重命名为您想要的名称,将数据库名设置为空字符串,然后更新多租户配置文件中的 multidatabase.connection 设置。

默认情况下,连接将查找名为 tenant_{id} 的数据库,其中 {id} 是来自租户模型的行的 ID。要覆盖此设置,您需要提供一个配置解析器,这将允许您根据每个租户调整所有连接配置设置。以下是如何使用默认实现的方法。

Multitenancy::setConnectionParser(function ($config = [], Tenant $tenant) {
    $config['database'] = 'tenant_'.$tenant->id;
    return $config;
});

实现

要使用此功能,简单地在 Eloquent 模型属性中引用 multitenancy 连接,或者在使用基础数据库库时使用 DB::connection('multitenancy')

身份验证

如果您在用户模型上使用了 TenantOwned 特性,您不需要对 Eloquent 提供程序进行任何操作。

对于基于会话的身份验证,您将想要使用 session.multi 守卫,它与默认会话守卫相同,不同之处在于它会在会话和 cookie 名称前添加租户主标识符,以便用户可以同时登录多个租户。

如果您使用数据库提供程序进行身份验证,您将想要使用 database.multi 提供程序,这样您就只能检索特定于当前租户的记录。

自定义提供程序

此包支持自定义提供程序。要创建自定义提供程序,创建一个实现了 Ollieread\Multitenancy\Contracts\Provider 的类,然后按照以下方式注册它

Multitenancy::extend('eloquent', function ($app, $config) {
    return new Eloquent($config['model']);
})->extend('database', function ($app, $config) {
    return new Database($app['db']->connection(), $config['table'], $config['identifiers']);
});

如果需要添加多个,此方法已设置用于级联。