thisisdevelopment / laravel-tenants
一个提供最小努力即可在laravel应用中实现多租户的包
0.1.3
2020-11-25 13:35 UTC
Requires
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()); } }