eloverde-sistemas / landlord
Laravel 5.2+的简单、单数据库多租户解决方案
Requires
- php: >=7.4
- illuminate/database: >=5.6
- illuminate/support: >=5.4
Requires (Dev)
- laravel/framework: >=5.4
- mockery/mockery: ~0.9|~1.0
- orchestra/testbench: >=3.6
- phpunit/phpunit: >=5.5
This package is auto-updated.
Last update: 2024-09-24 17:56:16 UTC
README
为Laravel & Lumen 5.2+提供单数据库多租户包。
从Landlord v1升级?请务必阅读变更日志,查看需要更新的内容。
安装
要开始使用,请要求此包
composer require hipsterjazzbo/landlord
Laravel
在config/app.php中添加ServiceProvider
'providers' => [ ... Eloverde\Landlord\LandlordServiceProvider::class, ],
如果您想的话,注册Facade
'aliases' => [ ... 'Landlord' => Eloverde\Landlord\Facades\Landlord::class, ],
您还可以发布配置文件
php artisan vendor:publish --provider="Eloverde\Landlord\LandlordServiceProvider"
并设置您的default_tenant_columns设置,如果您有全局默认值。LandLord将使用此设置来范围没有设置$tenantColumns属性的模型。
Lumen
您需要在bootstrap/app.php中设置服务提供者
$app->register(Eloverde\Landlord\LandlordServiceProvider::class);
并确保您已取消注释$app->withEloquent()。
使用
此包假定您在所有租户范围表中至少有一个列引用了每行所属的租户。
例如,您可能有一个companies表,以及许多其他具有company_id列的其他表。
添加和删除租户
重要提示:Landlord是无状态的。这意味着当您调用
addTenant()时,它只会范围到当前请求。确保以这种方式添加您的租户,以便它在每个请求上发生,并在您需要范围模型之前,如中间件或作为无状态认证方法(如OAuth)的一部分。
您可以通过调用addTenant()告诉Landlord自动范围到一个给定的租户,无论是通过Landlord外观,还是通过注入一个TenantManager()实例。
您可以通过传递租户列和ID
Landlord::addTenant('tenant_id', 1);
或者一个租户模型实例
$tenant = Tenant::find(1); Landlord::addTenant($tenant);
如果您传递模型实例,Landlord将使用Eloquent的getForeignKey()方法来决定租户列名称。
您可以添加所需的任何租户,但是Landlord一次只允许一个类型的租户。
要删除租户并停止通过它进行范围,只需调用removeTenant()
Landlord::removeTenant('tenant_id'); // Or you can again pass a Model instance: $tenant = Tenant::find(1); Landlord::removeTenant($tenant);
您还可以检查Landlord当前是否正在通过给定的租户进行范围
// As you would expect by now, $tenant can be either a string column name or a Model instance Landlord::hasTenant($tenant);
如果出于某种原因需要,您可以检索Landlord的租户
// $tenants is a Laravel Collection object, in the format 'tenant_id' => 1 $tenants = Landlord::getTenants();
设置您的模型
要设置一个自动范围的模型,只需使用BelongsToTenants特质
use Illuminate\Database\Eloquent\Model; use Eloverde\Landlord\BelongsToTenants; class ExampleModel extends Model { use BelongsToTenants; }
如果您想为特定模型覆盖适用的租户,可以设置$tenantColumns属性
use Illuminate\Database\Eloquent\Model; use Eloverde\Landlord\BelongsToTenants; class ExampleModel extends Model { use BelongsToTenants; public $tenantColumns = ['tenant_id']; }
创建新的租户范围模型
当您创建一个使用BelongsToTenants的新模型实例时,如果它们尚未设置,Landlord将自动添加任何适用的租户ID
// 'tenant_id' will automatically be set by Landlord $model = ExampleModel::create(['name' => 'whatever']);
查询租户范围模型
添加租户后,对使用BelongsToTenant的模型的查询将自动范围
// This will only include Models belonging to the current tenant(s) ExampleModel::all(); // This will fail with a ModelNotFoundForTenantException if it belongs to the wrong tenant ExampleModel::find(2);
注意:在开发多租户应用程序时,有时可能会很困惑,为什么您会不断得到针对确实存在的行的
ModelNotFound异常,因为这些行属于错误的租户。Landlord会捕获这些异常,并将它们重新抛出为
ModelNotFoundForTenantException,以帮助您解决问题:)
如果您需要查询所有租户,可以使用allTenants()
// Will include results from ALL tenants, just for this query ExampleModel::allTenants()->get()
在底层,房东使用了Laravel的匿名全局作用域。这意味着如果你同时为多个租户设置作用域,并且想要在单个查询中排除其中一个,你可以这样做
// Will not scope by 'tenant_id', but will continue to scope by any other tenants that have been set ExampleModel::withoutGlobalScope('tenant_id')->get();
贡献
如果你发现了一个问题,或者有更好的方法来完成某些事情,请随时打开一个issue或pull request。
