alanshearer / envtenant
Laravel 多租户感知 Artisan 工具。
Requires
- laravel/framework: ^5.2
- vlucas/phpdotenv: ^2.4
Requires (Dev)
- phpunit/phpunit: ~4.0
README
版本 2.3.0 变更
- 支持 Laravel 5.4。
版本 2.2.9 变更
- 支持 Laravel 5.3。
版本 2.2.6 变更
- 将连接列设置为 'pending' 以阻止租户访问,直到管理员批准。
版本 2.2.3 变更
- 增加了获取所有租户的能力
- 增加了激活并运行所有租户模型回调的能力
- 增加了通过 ID 获取租户的能力,而不是子域或域名 (example.com/{tenantId})
版本 2.2.2 变更
- 删除了通用监听器
- 删除了公开的 setDefaultConnection 方法
- 将解析器注册改为 app('tenant')
- 添加了 TenantContract 以启用自定义模型
- 更新了文档
Laravel 5.2 EnvTenant 包使您能够轻松地将多租户功能添加到应用程序中。此包采用极简方法,仅提供基本要素 - 无视图、路由或配置。只需将其放入其中,运行迁移,然后开始添加租户。您的应用程序将通过动态设置的 config('tenant') 值访问当前租户信息。可选地,您可以让应用程序重新连接到默认主数据库,以便租户可以管理其他租户的账户等。而且,也许是最好的部分,Artisan 完全支持多租户!只需向任何命令添加 --tenant 选项,即可在该命令上运行一个或所有租户。适用于迁移、队列等!
EnvTenant 还提供 TenantContract、触发 Laravel 事件以及抛出 TenantNotResolvedException,因此您可以轻松添加自定义功能并对其进行调整以满足您的需求。
Laravel EnvTenant 最初由 @leemason 从 Laravel Tenantable 项目分叉。Lee 应当被归功于在 Artisan 中全局添加 --tenant 选项的大量工作,以及为该想法提供灵感。此项目与 Tenantable 不同的地方在于其管理数据库连接设置的方法。Tenantable 将设置存储在数据库中,并提供了无限域名。EnvTenant 依赖于您的 ENV 和数据库配置,仅在表中存储连接名称,并且每个租户只允许一个子域和域名,这对于大多数应用程序来说通常已经足够了。EnvTenant 还在找不到租户时抛出 TenantNotResolvedException,您可以捕获它。
简单安装与使用
Composer 安装
composer require alanshearer/envtenant:2.2.*
然后运行 composer dump-autoload。
安装租户数据库表
artisan migrate --path /vendor/alanshearer/envtenant/migrations
安装服务提供者
AlanShearer\EnvTenant\TenantServiceProvider::class,
创建租户(仅使用标准 Eloquent 模型)
$tenant = new \AlanShearer\EnvTenant\Tenant(); $tenant->name = 'ACME Inc.'; $tenant->email = 'person@acmeinc.com'; $tenant->subdomain = 'acme'; $tenant->alias_domain = 'acmeinc.com'; $tenant->connection = 'db1'; $tenant->meta = ['phone' => '123-123-1234']; $tenant->save();
完成!极简,简单。每当您的应用程序通过 http://acme.domain.com 或 http://acmeinc.com 访问时,默认数据库连接将设置为 "db1",表前缀将切换为 "acme_",config('tenant') 将设置租户详细信息,允许您从视图或应用程序中访问值。
高级 EnvTenant 使用方法
Artisan
// migrate master database tables
php artisan migrate
// migrate specific tenant database tables
php artisan migrate --tenant=acme
// migrate all tenant database tables
php artisan migrate --tenant=*
--tenant 选项适用于所有 Artisan 命令。
租户
\AlanShearer\EnvTenant\Tenant
类是一个简单的 Eloquent 模型,提供基本的租户设置。
$tenant = new \AlanShearer\EnvTenant\Tenant(); // The unique name field identifies the tenant profile $tenant->name = 'ACME Inc.'; // The non-unique email field lets you email tenants $tenant->email = 'person@acmeinc.com'; // The unique subdomain field represents the subdomain portion of a domain and the database table prefix // Set subdomain and alias_domain field to NULL to access tenant by ID instead $tenant->subdomain = 'acme'; // The unique alias_domain field represents an alternate full domain that can be used to access the tenant // Set subdomain and alias_domain field to NULL to access tenant by ID instead $tenant->alias_domain = 'acmeinc.com'; // The non-unique connection field stores the Laravel database connection name $tenant->connection = 'db1'; // The meta field is cast to an array and allows you to store any extra values you might need to know $tenant->meta = ['phone' => '123-123-1234']; $tenant->save();
租户解析器
\AlanShearer\EnvTenant\TenantResolver
类负责在 Web 和 Artisan 访问期间解析和管理活动租户。您可以使用 app('tenant')
访问解析器类。
// get the resolver instance $resolver = app('tenant'); // check if valid tenant $resolver->isResolved(); // get the active tenant (returns Tenant model or null) $tenant = $resolver->getActiveTenant(); // get all tenants (returns collection of Tenant models or null) $tenants = $resolver->getAllTenants(); // activate and run all tenants through a callback function $resolver->mapAllTenants(function ($tenant) {}); // reconnect default connection enabling access to "tenants" table $resolver->reconnectDefaultConnection(); // reconnect tenant connection disabling access to "tenants" table $resolver->reconnectTenantConnection();
如果您想使用自定义模型,请注册一个自定义服务提供程序,将其绑定到TenantContract并解析为您的自定义租户模型的一个实例。只要您在加载EnvTenant\TenantServiceProvider之前加载了您的服务提供程序,EnvTenant将自动回退到您的自定义模型。
在您的app/Providers文件夹中创建此示例服务提供程序,命名为CustomTenantServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Tenant; class CustomTenantServiceProvider extends ServiceProvider { public function boot() { $this->app->singleton('TenantContract', function() { return new Tenant(); }); } public function register() { // } }
然后在您的config/app.php文件中注册App\Providers\CustomTenantServiceProvider::class
。
事件
在整个生命周期中都会触发事件,允许您监听和自定义行为。
租户激活
AlanShearer\EnvTenant\Events\TenantActivatedEvent
租户解析
AlanShearer\EnvTenant\Events\TenantResolvedEvent
租户未解析
AlanShearer\EnvTenant\Events\TenantNotResolvedEvent
租户未通过Web解析,将抛出异常
AlanShearer\EnvTenant\Events\TenantNotResolvedException
保护会话
Laravel中的会话可以被锁定到域名,防止用户跨域名跳转,并可能保留他们的身份验证。以下是一些可能有用的快速示例代码。我相信还有更复杂的方法来管理这一点。未来,我也可能会为EnvTenant添加一些跨域名安全功能。
在您的会话配置文件中,将域名值改为如下所示
'domain' => ( ! empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : null,