henryavila/laravel-nova-multitenancy

在 Laravel Nova 中集成多租户单数据库。

v3.3.0 2024-04-11 18:19 UTC

README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

在 Laravel Nova 中集成多租户单数据库。

此包基于 https://spatie.be/docs/laravel-multitenancy。因此,spatie/laravel-multitenancy 的逻辑和配置仍然适用

安装

您可以通过 composer 安装此包

composer require henryavila/laravel-nova-multitenancy

您可以使用以下命令发布配置、视图、迁移和翻译

php artisan vendor:publish --provider="HenryAvila\LaravelNovaMultitenancy\LaravelNovaMultitenancyServiceProvider" 

视图文件将被发布,您可以按需自定义它。别忘了运行 npm run build

您可以使用以下命令运行迁移(创建租户表)

php artisan migrate

编辑文件 app\Http\Kernel.php,在 web 组中添加条目并创建租户组

protected $middlewareGroups = [
    // ...
    
    'web' => [
        // ...
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\SetTenantMiddleware::class,
    ],
    
    // ...
    
    'tenant' => [
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\NeedsTenant::class,
        \HenryAvila\LaravelNovaMultitenancy\Http\Middleware\EnsureValidTenantSession::class,
    ]
];

如果您在 Laravel Nova 中激活了(用户模拟)[https://nova.laravel.net.cn/docs/4.0/customization/impersonation.html],您必须设置此事件监听器。

编辑文件 App\Providers\EventServiceProvider 并添加

 protected $listen = [
        \Laravel\Nova\Events\StartedImpersonating::class  => [
            \HenryAvila\LaravelNovaMultitenancy\Listeners\ClearTenantSessionListener::class,
        ],
        \Laravel\Nova\Events\StoppedImpersonating::class => [
            \HenryAvila\LaravelNovaMultitenancy\Listeners\ClearTenantSessionListener::class,
        ],
];

让您的 User 模型继承 \HenryAvila\LaravelNovaMultitenancy\Models\User

如果您想自定义租户模型,在配置文件中更改它

将 traits \HenryAvila\LaravelNovaMultitenancy\Traits\ModelWithTenant 添加到所有具有租户感知能力的模型

在您的 database 文件中添加一个 tenant_connection 条目,与租户数据库连接。见

return [
    // database.php
    'tenant_connection' => env('DB_TENANT_CONNECTION', 'tenant'),

这是连接和数据库之间的关系

PS.: 不要忘记在 database.connections 配置文件中创建这些连接。

用法

要保护特定的路由,只需将 'tenant' 中间件添加到路由即可

// in a routes file

Route::middleware('tenant')->group(function() {
    // routes
});

如果您收到错误:Route [login] not defined.。请记住,在您的 App\Http\Middleware\Authenticate 文件中将路由从 login 更改为 nova.login

protected function redirectTo($request)
{
    return $request->expectsJson() ? null : route('nova.login');
}

另一种不将租户定义为路由的方法是在路由声明中设置以下 default 数据

Route::get('/', [Controller::class, 'index'])
		->defaults(\HenryAvila\LaravelNovaMultitenancy\LaravelNovaMultitenancy::SKIP_ROUTE, true);

如果 Tenantdomains 关系,允许根据当前域名定义当前租户。该 domains 关系模型必须包含一个 fqdn 属性,其中包含 fqdn 域名

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

有关如何报告安全漏洞的详细信息,请参阅我们的安全策略 我们的安全策略

鸣谢

许可

MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件