sbine/simple-tenancy

同一数据库中的简单Laravel多租户

0.0.6 2022-02-09 01:44 UTC

This package is auto-updated.

Last update: 2024-09-11 23:49:15 UTC


README

Build status

Simple Tenancy向存储在共享数据库中的Eloquent模型添加自动多租户支持。

在大多数情况下,它不需要任何配置,依赖于Laravel的既定约定和每个表上的单个列。

工作原理

底层仅有4个组件

  1. Tenant: 跟踪当前用户
  2. HasTenancy: 一个用于属于租户的模型的特质,用于注册
  3. TenancyScope: 一个全局作用域,限制所有模型的查询都限于当前租户
  4. TenancyObserver: 一个观察者,在保存时设置当前租户列/标识符

默认情况下,租户是Laravel的Auth::user(),并且当没有用户认证时,所有租户检查都被禁用。

安装

  1. 使用Composer进行安装
composer require sbine/simple-tenancy
  1. HasTenancy特质添加到所有属于租户的模型中
class Account extends Model
{
    use \Sbine\Tenancy\HasTenancy;
}
  1. 确保每个使用该特质的模型表上存在user_id列。

自定义租户列/ID

如果需要,您可以通过扩展Tenant类并将它绑定到容器中来自定义租户列或标识符的名称。

class MyTenant extends \Sbine\Tenancy\Tenant
{
    /**
     * Retrieve the column identifying each model's tenant.
     */
    public function column()
    {
        return 'tenant_hashid';
    }

    /**
     * Retrieve the current tenant's identifier.
     */
    public function id()
    {
        return $this->user->hashid;
    }
}

自定义租户行为

默认情况下,如果没有用户认证,租户将完全禁用。这是设计上的选择,以便库不会干扰测试、播种和其他未认证的模型使用。

要更改任何方式的租户行为,您可以在应用容器中覆盖Tenant绑定。

例如,防止在未认证的情况下查询和保存所有租户模型

    // In AppServiceProvider.php
    public function register()
    {
        $this->app->singleton(\Sbine\Tenancy\Tenant::class, function () {
            // Throw an AuthenticationException if auth check fails
            return new \Sbine\Tenancy\Tenant(Auth::authenticate());
        });
    }

要允许基于策略或方法覆盖租户检查,传递一个返回truefalse的回调函数

    // In AppServiceProvider.php
    public function register()
    {
        $this->app->singleton(\Sbine\Tenancy\Tenant::class, function () {
            return new \Sbine\Tenancy\Tenant(Auth::user(), function ($user) {
                return $user->can('admin');
            });
        });
    }

要完全控制租户行为,您可以绑定自己的Tenant实现

    // In AppServiceProvider.php
    public function register()
    {
        $this->app->singleton(\Sbine\Tenancy\Tenant::class, function () {
            return new MyTenant;
        });
    }

禁用租户

为了方便,提供了一个SuperAdmin类,您可以在任何时候将其绑定以禁用租户检查

    $this->app->singleton(\Sbine\Tenancy\Tenant::class, \Sbine\Tenancy\SuperAdmin::class);