aura-is-here / laravel-multi-tenant
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*|5.0.*|5.1.*
Requires (Dev)
- laravel/framework: 4.2.*|5.0.*|5.1.*
- mockery/mockery: ~0.9
- phpunit/phpunit: ~4.0
This package is auto-updated.
Last update: 2022-02-01 12:36:54 UTC
README
注意:此软件包已迁移
此软件包现在仅支持 Laravel 5.2+,已迁移到 https://github.com/HipsterJazzbo/Landlord。
此版本将不再维护,但将保留在此处以保持向后兼容性。
Laravel 5.2+ 的通用多租户软件包。意外地从 @tonydew 的工作中衍生出来,并在 @rizqidjamaluddin 的帮助下。
安装
要开始使用,请在 composer.json 中添加此软件包,并运行 composer update
"aura-is-here/laravel-multi-tenant": "dev-master"
更新 composer 后,将 ServiceProvider 添加到 app/config/app.php 文件中的 providers 数组中
AuraIsHere\LaravelMultiTenant\LaravelMultiTenantServiceProvider::class,
你可能需要设置别名
'TenantScope' => AuraIsHere\LaravelMultiTenant\Facades\TenantScopeFacade::class
你还可以发布配置文件
php artisan vendor:publish --provider="AuraIsHere\LaravelMultiTenant\LaravelMultiTenantServiceProvider"
并设置你的 tenant_column
设置,如果你有一个应用级别的默认值。
使用方法
首先,此软件包假设你在所有租户作用域的表中都有一个列,该列引用了每一行所属的租户。
例如,你可能有一个 companies
表,并且你的其他表可能都有一个 company_id
列(带外键,对吗?)。
接下来,你必须调用 TenantScope::addTenant($tenantColumn, $tenantId)
。在哪里调用都无关紧要,只要它发生在每个请求上即可。这是重要的;如果你只在你登录方法中设置租户,那么后续请求将不会运行,查询将不再作用域。
一些调用 TenantScope::addTenant($tenantColumn, $tenantId)
的好地方包括
- 在一个全局中间件中
- 在 oauth 系统中,每次请求检查令牌的地方
- 在基控制器的构造函数中
一旦一切都设置好了,只需在所有你想要按租户作用域的模型中 use
该特性即可
<?php use AuraIsHere\LaravelMultiTenant\Traits\TenantScopedModelTrait; class Model extends Eloquent { use TenantScopedModelTrait; }
从今往后,对该模型的所有操作都将自动作用域。
你还可以在模型上设置 $tenantColumns
属性,以覆盖适用于该模型的租户。
$models = Model::all(); // Only the Models with the correct tenant id $model = Model::find(1); // Will fail if the Model with `id` 1 belongs to a different tenant $newModel = Model::create(); // Will have the tenant id added automatically
如果你需要跨所有租户运行查询,你可以轻松完成
$allModels = Model::allTenants()->get(); //You can run any fluent query builder methods here, and they will not be scoped by tenant
当你开发多租户应用程序时,有时你可能不清楚为什么你总是收到 ModelNotFound
异常。
Laravel Multi Tenant 将捕获这些异常,并将它们重新抛出为 ModelNotFoundForTenant
,以帮助你解决问题:)
贡献
请!这还不是完整的解决方案,但我们没有理由一次又一次地重新发明这个轮子。如果你发现了一个问题,或者有更好的方法来完成某事,请提出问题或发起拉取请求。