aventure-cloud/laravel-tenancy

适用于 Laravel 应用的单数据库多租户解决方案

2.0.8 2018-10-06 14:10 UTC

This package is auto-updated.

Last update: 2024-09-22 21:44:04 UTC


README

Latest Stable Version Total Downloads License

适用于 Laravel 应用的单数据库多租户解决方案。

安装

composer require aventure-cloud/laravel-tenancy

安装后,您不需要在配置中添加 MultiTenancyServiceProvider,因为它可以从 Laravel 中自动发现。

配置

为了完全控制包的行为,您需要发布 config/multitenancy.php 文件。

php artisan vendor:publish --provider="AventureCloud\MultiTenancy\MultiTenancyServiceProvider"

    'tenant' => [
        // The model representing a tenant
        'model' => App\Tenant::class,

        // The foreign key for identifying tenant ownership in all eloqunet models
        'foreign_key' => env('MULTITENANCY_FOREIGN_KEY', 'company_id'),
        
        // The field of tenant model used as subdomain key
        'identifier' => 'slug',
    ],

    // Field used to identify a tenant in the url
    'hostname' => [
        'default' => env('MULTITENANCY_HOSTNAME_DEFAULT', 'www.mydomain.com')
    ]

Eloquent 模型特性

BelongsToTenant 特性附加到您希望按租户范围化的模型上

class Post extends Model 
{
    use BelongsToTenant;
    
    // ...
}

IsTenant 特性添加到您的 eloquent 模型,该模型表示您的应用中的租户实体

class Company extends Model 
{
    use IsTenant;
    
    // ...
}

配置多租户路由

在应用任何其他中间件之前,您需要将所有路由包裹在租户依赖项中。您可以使用我们的外观提供的路由方法来自动为您处理租户识别过程。

protected function mapTenantRoutes()
{
    // Wrap tenant routes here before every others middleware
    Tenancy::routes()->group(function () {
    
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/tenant/web.php'));
            
    });
}

默认路由

您的落地页需要在您的个人网址下加载,因此您需要告诉 Laravel 如何识别您的通用路由。在您的 RoutesServiceProvider 中,您可以修改您的 map 方法如下

protected function map()
{

    Route::domain(config('multitenancy.hostname.default')->group(function() {
		$this->mapApiRoutes();
        $this->mapWebRoutes();
    });
	
}

验证规则

通过租户范围化您的应用程序可能会导致 uniqueexists 验证规则出现错误行为,这些规则在数据库查询时不考虑默认的租户范围。

此包附带这两个规则的扩展版本,它们会根据租户过滤查询。

public function store(Request $request)
{
    $request->validate([
        'email' => [Tenancy::unique('users', 'email')],
        'role_id' => [Tenancy::exists('roles', 'id')]
    ])
}

队列

将作业发送到队列的一个缺点是,这些作业将根据您的队列配置(包括 redis 和 beanstalk)在不同的过程中执行。

为了帮助您处理租户感知作业,我们提供了一个 TenantAwareJob。您应该使用此特性而不是按照 Laravel 文档中的建议应用 SerializesModel 特性。

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, TenantAwareJob;
    
    // ...
}

事件

当租户被创建并存储在 Tenancy 服务中时,该包将触发一个附带租户实例的事件

  • 租户加载

许可证

此包受 MIT 许可证的约束。