sbine / simple-tenancy
同一数据库中的简单Laravel多租户
0.0.6
2022-02-09 01:44 UTC
Requires
- php: ^7.4 || ^8.0
- laravel/framework: ^7.0 || ^8.0 || ^9.0
Requires (Dev)
- orchestra/testbench: ^5.0 || ^6.0 || ^7.0
README
Simple Tenancy向存储在共享数据库中的Eloquent模型添加自动多租户支持。
在大多数情况下,它不需要任何配置,依赖于Laravel的既定约定和每个表上的单个列。
工作原理
底层仅有4个组件
Tenant
: 跟踪当前用户HasTenancy
: 一个用于属于租户的模型的特质,用于注册TenancyScope
: 一个全局作用域,限制所有模型的查询都限于当前租户TenancyObserver
: 一个观察者,在保存时设置当前租户列/标识符
默认情况下,租户是Laravel的Auth::user()
,并且当没有用户认证时,所有租户检查都被禁用。
安装
- 使用Composer进行安装
composer require sbine/simple-tenancy
- 将
HasTenancy
特质添加到所有属于租户的模型中
class Account extends Model { use \Sbine\Tenancy\HasTenancy; }
- 确保每个使用该特质的模型表上存在
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()); }); }
要允许基于策略或方法覆盖租户检查,传递一个返回true
或false
的回调函数
// 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);