alanshearer/envtenant

Laravel 多租户感知 Artisan 工具。

2.3.2 2017-02-10 16:50 UTC

This package is not auto-updated.

Last update: 2024-09-17 10:44:37 UTC


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.comhttp://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,

祝您玩得开心!报告问题或想法。