thisisdevelopment/laravel-tenants

一个提供最小努力即可在laravel应用中实现多租户的包

0.1.3 2020-11-25 13:35 UTC

This package is auto-updated.

Last update: 2024-09-25 22:03:28 UTC


README

一个提供在laravel应用中实现简单多租户的包

经过简单的设置(见下文)后,您将拥有一个功能齐全的多租户应用程序,它开箱即用

  • 允许用户与租户对象之间建立多对多关系。
  • 支持用户在多个租户之间轻松切换(通过 x-selected-tenant 头部或通过 selected-tenant 饼干)
  • 一旦切换,默认情况下只允许访问单个租户对象,并且您可以轻松实现租户作用域模型(见设置 #4)
  • 允许使用tinker(或任何其他cli命令)与特定租户(--tenant=)
  • 从选择租户的上下文提交的所有作业在从队列执行时将使用该租户
  • 当创建租户模型时,租户数据库将自动创建

示例请参见 https://github.com/thisisdevelopment/laravel-tenants-example

待办事项

  • 与laravel-test-snapshot集成
  • 提供适当的种子支持
  • 支持sqlite
  • 清理
  • ..

设置

要使用此包设置多租户,您需要以下步骤

1) 包含此包

composer require thisisdevelopment/laravel-tenants

2) 找到作为租户的模型(例如:客户/用户)并实现我们的 Tenant 合同

use Illuminate\Database\Eloquent\Model;
use ThisIsDevelopment\LaravelTenants\Contracts\Tenant;
use ThisIsDevelopment\LaravelTenants\Traits\ProvidesTenant;

class Customer extends Model implements Tenant
{
    use ProvidesTenant;

}

并在您的 AppServiceProvider 类中注册它

use Illuminate\Support\ServiceProvider;
use ThisIsDevelopment\LaravelTenants\TenantsProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        TenantsProvider::setup(Customer::class);
    }
}

3) 找到应位于特定租户数据库中的模型并使用我们的 onTenantDB 特性

use Illuminate\Database\Eloquent\Model;
use ThisIsDevelopment\LaravelTenants\Traits\OnTenantDB;

class Test extends Model
{
    use OnTenantDB;
}

并将这些模型的全部迁移/种子器移动到 database/migrations/<租户模型名称> / database/seeds/<租户模型名称>,以便它们仅用于租户数据库。

4) 找到在切换到租户数据库后应受限制的模型并使用我们的 TenantScoped 特性

use Illuminate\Database\Eloquent\Model;
use ThisIsDevelopment\LaravelTenants\Traits\TenantScoped;
use Illuminate\Database\Eloquent\Builder;

class Settings extends Model
{
    use TenantScoped;
  
    public function scopeTenant(Builder $query, Customer $tenant): void
    {
       // custom filtering to limit this to what the current tenant is allowed to see 
    }
}

5) (可选)找到您用于认证的模型,并通过使用 ProvidesTenantAuth 特性实现 TenantAuth 接口,使其负责提供允许的租户 + 默认租户

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Collection;
use ThisIsDevelopment\LaravelTenants\Contracts\TenantAuth;
use ThisIsDevelopment\LaravelTenants\Traits\ProvidesTenantAuth;

class User extends Authenticatable implements TenantAuth
{
    use ProvidesTenantAuth;
    
    public function getAllowedTenants(): ?Collection
    {
        return $this->customers()->get();
    }

    public function getDefaultTenant()
    {
        return $this->getAllowedTenants()->first()->id;
    }

    public function customers(): BelongsToMany
    {
        return $this->belongsToMany(Customer::class, 'customer_users', 'user_id', 'customer_id');
    }

    public function scopeTenant(Builder $query, Customer $tenant): void
    {
        $query->whereIn($this->getKeyName(), $tenant->users()->get()->pluck('id')->all());
    }
}