aura-is-here/laravel-multi-tenant

此软件包已被废弃,不再维护。作者建议使用 hipsterjazzbo/landlord 软件包。
此软件包的最新版本(v0.1.0)没有提供许可信息。

v0.1.0 2016-01-19 19:27 UTC

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,以帮助你解决问题:)

贡献

请!这还不是完整的解决方案,但我们没有理由一次又一次地重新发明这个轮子。如果你发现了一个问题,或者有更好的方法来完成某事,请提出问题或发起拉取请求。