protosofia/ben10ant

一个真正有用的 Laravel 多租户包,它是认真的,至少我在尽力

v1.0.6 2019-02-15 01:30 UTC

This package is auto-updated.

Last update: 2024-09-15 15:13:04 UTC


README

一个真正有用的 Laravel 多租户包,它是认真的,至少我在尽力...

安装

composer require protosofia/ben10ant

配置

控制台命令配置

添加到 app/Console/Kernel.php

...
protected $commands = [
    ...
    \Protosofia\Ben10ant\Commands\TenantCreate::class,
    \Protosofia\Ben10ant\Commands\TenantMigrate::class,
    \Protosofia\Ben10ant\Commands\TenantMigrateRefresh::class,
    \Protosofia\Ben10ant\Commands\TenantMigrateRollback::class,
    \Protosofia\Ben10ant\Commands\TenantSeed::class,
    ...
];
...

中间件配置

添加到 app/Http/Kernel.php

...
protected $middleware = [
    ...
    \Protosofia\Ben10ant\Middlewares\CheckTenantByKey::class,
    ...
];
...

服务提供者配置

添加到 config/app.php

...
'providers' => [
    ...
    \Protosofia\Ben10ant\Providers\TenantServiceProvider::class,
    ...
],
...

外观

添加到 config/app.php

...
'aliases' => [
    ...
    'Tenant' => Protosofia\Ben10ant\Facades\TenantFacade::class,
    ...
],
...

模型

此包包含 3 种类型的模型

  • Protosofia\Ben10ant\Models\TenantModel:此模型始终针对 主数据库,其中包含“租户”表;
  • Protosofia\Ben10ant\Models\TenantBaseModel:此模型始终针对 当前租户数据库,换句话说,当前登录用户的租户;
  • Protosofia\Ben10ant\Models\TenantAuthenticatableBaseModel:此模型与 TenantBaseModel 完全相同,但实现了 Illuminate\Foundation\Auth\User

要管理“租户”表,可以创建以下模型

...
use Protosofia\Ben10ant\Models\TenantModel;

class Tenant extends TenantModel
{
    //
}

要有一个租户用户(可验证的),可以创建以下模型

...
use Protosofia\Ben10ant\Models\TenantAuthenticatableBaseModel;

class User extends TenantAuthenticatableBaseModel
{
    use Notifiable;
    ...
}

要处理租户数据(不可验证)的模型,可以创建以下模型

...
use Protosofia\Ben10ant\Models\TenantBaseModel;

class YourTenantTable extends TenantBaseModel
{
    protected $table = 'your_tenant_table'; //optional
    ...
}

用法

配置

php artisan vendor:publish

这将发布配置文件。

控制台命令

创建新的租户

tenant:create {name} {keyname}
  • name 租户名称。例如,'租户阿尔法';
  • keyname 租户昵称,用于身份验证(类似于子域)。例如,'tenant-alpha';

此命令是一个租户创建向导,您可以配置数据库连接和存储。

在租户数据库上运行迁移

tenant:migrate {tenant} {--force} {--path} {--pretend} {--step}
  • tenant 租户 keyname。例如,'tenant-alpha';
  • --force 强制在生产环境中运行操作;
  • --path 要执行的迁移文件路径。
  • --pretend 输出将要运行的 SQL 查询。
  • --step 强制迁移运行,以便可以单独回滚。

此命令是对 'migrate' 命令的间接调用,它自动设置租户连接。如果未定义路径选项,则假设默认路径:database/migrations/tenants。

刷新并运行租户数据库上的迁移

tenant:migrate:refresh {tenant} {--force} {--path} {--seed} {--seeder} {--step}
  • tenant 租户 keyname。例如,'tenant-alpha';
  • --force 强制在生产环境中运行操作;
  • --path 要执行的迁移文件路径。
  • --seed 表示是否应重新运行种子任务。
  • --seeder 根种子类的名称。
  • --step 要回滚并重新运行的迁移数量。

此命令是对 'migrate:refresh' 命令的间接调用,它自动设置租户连接。如果未定义路径选项,则假设默认路径:database/migrations/tenants。

在租户数据库上回滚迁移

tenant:migrate:rollback {tenant} {--force} {--path} {--seed} {--seeder} {--step}
  • tenant 租户 keyname。例如,'tenant-alpha';
  • --force 强制在生产环境中运行操作;
  • --path 要执行的迁移文件路径。
  • --pretend 输出将要运行的 SQL 查询。
  • --step 要回滚的迁移数量。

此命令是对 'migrate:rollback' 命令的间接调用,它自动设置租户连接。如果未定义路径选项,则假设默认路径:database/migrations/tenants。

在租户数据库上播种

tenant:db:seed {tenant} {--force} {--class}
  • tenant 租户 keyname。例如,'tenant-alpha';
  • --force 强制在生产环境中运行操作;
  • --class 根种子类的名称 [默认: "DatabaseSeeder"]

此命令是对 'db:seed' 命令的间接调用,它自动设置租户连接。如果未定义类选项,则假设默认类:DatabaseSeeder。

中间件

此包提供 3 个中间件

  • Protosofia\Ben10ant\Middlewares\CheckTenantByID:从标题 TENANT 获取值并尝试匹配租户 pk 数据库记录;
  • Protosofia\Ben10ant\Middlewares\CheckTenantByKey:从标题 TENANT 获取值并尝试匹配租户 keyname 数据库记录;
  • Protosofia\Ben10ant\Middlewares\CheckTenantByUUID:从标题 TENANT 获取值并尝试匹配租户 uuid 数据库记录;

单例服务/外观

此服务是单例的,可以通过外观 Tenant 访问。例如

...
use Tenant;

$tenant = Tenant::setTenantByUUID($uuid);

if (!$tenant) {
    return response()->json(['error' => 'No tenant found.'], 404);
}
...

此服务有 4 个方法来设置租户

  • setTenantByID($id) - 通过 pk 设置租户;
  • setTenantByUUID($uuid) - 通过UUID设置租户;
  • setTenantByKey($key) - 通过键名设置租户;
  • setTenant(TenantModelInterface $tenant) - 使用租户模型实例设置租户;

待办事项

  • - 已完成
    • - 已完成
    • - 已完成
  • - 已完成
    • - 已完成
    • - 已完成
  • - 已完成
  • - 已完成
  • - 已完成
  • - 已完成
  • - 已完成