租户识别
# 租户识别
该软件包让你用以下方法识别租户。
- 域名识别 (
acme.com
) - 子域识别 (
acme.yoursaas.com
) - 域名或子域名识别(上述两种)。
- 路径识别(
yoursaas.com/acme/dashboard
) - 请求数据识别(
yoursaas.com/users?tenant_id=acme
- 或使用请求头)
但是,您可以自由编写其他租户解析器。
上面提到的所有识别方法都有自己的中间件。 您可以在下面阅读有关每种识别方法的更多信息。
# 域名识别
要使用这种识别方法,请确保你的租户模型使用HasDomains
特性。
请务必阅读文档中的域名页面。
这种关系是租户有许多域名
。将主机名存储在domains
表的domain
列中。
这种识别方法是由Stancl\Tenancy\Middleware\InitializeTenancyByDomain
中间件提供的。
# 子域名识别
这与域名识别完全相同,只是你将子域名存储在domain
表的domain
列中。
这种方法而不是在domain
列中存储子域的完整主机名的好处是,你可以在你的任何中心域上使用这个子域。
这个方法的中间件是Stancl\Tenancy\Middleware\InitializeTenancyBySubdomain
。
# 域/子域名 的综合识别
如果你想同时使用子域和域名,请使用Stancl\Tenancy\Middleware\InitializeTenancyByDomainOrSubdomain
中间件。
在domain
列中包含点的记录将被视为域名/主机名(例如:foo.bar.com
),不包含任何点的记录将被视为子域(例如:foo
)。
# 路径识别
有些应用程序希望使用一个单一的域名,但使用路径来识别租户。这将是你希望客户使用你的品牌产品,而不是给他们一个白标产品,让他们在自己的域名上使用。
要做到这一点,请使用Stancl\Tenancy\Middleware\InitializeTenancyByPath
中间件,并确保你的路由是以/{tenant}
为前缀的。
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
Route::group([
'prefix' => '/{tenant}',
'middleware' => [InitializeTenancyByPath::class],
], function () {
Route::get('/foo', 'FooController@index');
});
如果你想自定义参数的名称(例如用team'代替
tenant',查看PathTenantResolver
的公共静态(public static)属性)。
# 请求数据识别
你可能想根据请求数据(头信息或查询参数)来识别租户。具有SPA前端和API后端的应用程序可能想使用这种方法。
这种识别方法的中间件是Stancl\Tenancy\Middleware\InitializeTenancyByRequestData
。
你可以自定义该中间件在请求中寻找的内容。默认情况下,它将寻找X-Tenant
头。如果没有找到该头,它将寻找 "租户 "查询参数。
如果你想使用一个不同的头,请改变静态属性:
use Stancl\Tenancy\Middleware\InitializeTenancyByRequestData;
InitializeTenancyByRequestData::$header = 'X-Team';
如果你想只使用查询参数标识,请将头的静态属性设置为空:
use Stancl\Tenancy\Middleware\InitializeTenancyByRequestData;
InitializeTenancyByRequestData::$header = null;
如果你想禁用查询参数的识别,只使用标题,请将参数的静态属性设置为空:
use Stancl\Tenancy\Middleware\InitializeTenancyByRequestData;
InitializeTenancyByRequestData::$queryParameter = null;
# 手动识别租户
参见手动初始化页面,了解如何手动识别租户。
# 定制 "失败 "逻辑
每个识别中间件都有一个静态$onFail
属性,可以用来定制当租户无法被识别时应该发生的行为。
\Stancl\Tenancy\Middleware\InitializeTenancyByDomain::$onFail = function ($exception, $request, $next) {
return redirect('https://my-central-domain.com/');
};