租户
# 租户
租户可以是任何实现 Stancl\Tenancy\Contracts\Tenant
接口的模型。
该扩展包带有一个基本的Tenant
模型,这个模型为平时常用的一些需求做好了准备,但在大多数情况下需要自己根据需求进行扩展,因为它不是固定这样的。
除了接口所需的功能外,基本模型还具有以下功能:
- 强制中央连接(即使在租户上下文中,您也可以与租户模型进行交互)
- 数据字段特征 — 允许您存储任意键。 在你的
tenants
表中不存在的属性会以序列化的JSON形式进入data
字段。。 - Id 生成特性 — 当你不提供 ID 时,将生成一个随机 uuid。 另一种方法是使用 AUTOINCREMENT 字段。 如果您希望使用数字 id,请将
create_tenants_table
迁移更改为使用bigIncrements()
或某些此类字段类型,并将tenancy.id_generator
配置设置为 null。 这将完全禁用 ID 生成,退回到数据库的自动增量机制。
大多数使用此扩展的应用程序需要域名/子域名标识和租户数据库。
为此,请创建一个新模型,例如 App\Tenant
,看起来像这样:
<?php
namespace App;
use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;
class Tenant extends BaseTenant implements TenantWithDatabase
{
use HasDatabase, HasDomains;
}
然后,在 config/tenancy.php
中配置包以使用此模型 :
'tenant_model' => \App\Tenant::class,
如果您想自定义域名Domain
模型,您也可以这样做。
如果您不需要域或数据库,请忽略上述步骤。 一切都会正常进行。
# 创建租户
你可以像其他模型一样创建租户:
$tenant = Tenant::create([
'plan' => 'free',
]);
创建租户后,将触发一个事件。 这将执行创建和迁移数据库之类的任务,这具体取决于哪些工作监听该事件。
# 自定义字段
租户模型的属性如果没有自己的字段,将被存储在data
JSON字段中。
你可以通过覆盖你的 Tenant
模型上的 getCustomColumns()
方法来定义自定义字段:
public static function getCustomColumns(): array
{
return [
'id',
'plan',
'locale',
];
}
不要忘记在自定义字段中保留id
!。
如果你想重命名data
字段,请在迁移中重命名它,并在你的模型上实现这个方法:
public static function getDataColumn(): string
{
return 'my-data-column';
}
请注意,使用 where()
查询 data
字段内的数据将要求您执行以下操作,例如:
where('data.foo', 'bar')
data字段只在模型检索和保存时被编码/解码。
有一个很好的经验是,当您需要使用WHERE
子句查询数据时,应该给一个专门的字段。 这将提高性能,并且您不必考虑 data.
前缀。
# 在租户环境中运行命令
您可以在租户的上下文中运行命令,然后通过将可调用对象传递给租户对象上的 run()
方法,返回到前一个上下文(无论是中央上下文还是其他租户的上下文)。 例如:
$tenant->run(function () {
User::create(...);
});
# 内部密钥
以内部前缀开头的键(默认情况下为 tenancy_
,但您可以通过覆盖 internalPrefix()
方法对其进行自定义)供内部使用,因此不要以此开头任何属性/字段名称。
# 事件
Tenant
模型调度 Eloquent 事件,所有这些事件都有自己的类。 您可以在 事件系统 页面上阅读更多相关信息。
# 访问当前租户
你可以使用tenant()
助手访问当前租户。你也可以传递一个参数,从该租户模型中获得一个属性,例如tenant('id')
。
另外,你也可以用Stancl\Tenancy\Contracts\Tenant
接口来注入模型,使用服务容器。
# 递增的ID
默认情况下,迁移使用 string
作为 id
列,并且当您在租户创建期间不提供 id
时,模型会生成 UUID。
如果您想改用递增 id,您可以覆盖 getIncrementing()
方法:
public function getIncrementing()
{
return true;
}