ollieread / laravel-multitenancy
Requires
- php: >=5.6.4
- laravel/framework: 5.3.* || 5.4.*
This package is not auto-updated.
Last update: 2022-02-01 13:04:50 UTC
README
- Laravel: 5.3 & 5.4
- 作者: Ollie Read
- 作者主页: http://ollieread.com
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',
默认情况下,这可以是eloquent或database。如果您添加了自定义提供者,请在这里使用其名称。
#####域名
'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
有一个可用特质,它使用默认列名slug和domain提供实现。它还提供了对模型上的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']);
});
如果需要添加多个,此方法已设置用于级联。