romegadigital / multitenancy-nova-tool
一个用于管理多租户的Laravel Nova工具。
Requires
- php: ^8.0
- kiritokatklian/nova-permission: ^4.0
- romegadigital/multitenancy: ^4.0
README
本软件包旨在与多租户软件包集成,以将多租户功能和管理工作引入Laravel的Nova。
本软件包会自动包含多租户软件包作为依赖项。请阅读文档了解如何将其与现有应用集成。
安装
使用Composer安装软件包
composer require romegadigital/multitenancy-nova-tool
然后按照安装说明设置多租户软件包。
接下来,您必须使用Nova注册工具。这通常在NovaServiceProvider
的tools
方法中完成。
// in app/Providers/NovaServiceProvider.php public function tools() { return [ // ... new \RomegaDigital\MultitenancyNovaTool\MultitenancyNovaTool, ]; }
本软件包需要超级管理员
或访问管理
权限。这可以通过“角色与权限”下包含的权限管理工具或通过我们的分配超级管理员命令来实现。
提示 如果您已经执行了
multitenancy:install
,则已创建了一个名为超级管理员
的角色和一个附加了访问管理
权限的权限。因此,您只需要将角色添加到用户。php artisan multitenancy:super-admin admin@example.com
用法
安装此软件包后,您的Nova应用中会出现标记为“多租户”和“角色与权限”的新菜单项。
要查看用户详细视图中的租户关系,请向您的app/Nova/User
资源添加一个BelongsToMany
字段
// in app/Nova/User.php use Laravel\Nova\Fields\BelongsToMany; public function fields(Request $request) { return [ // ... BelongsToMany::make('Tenants', 'tenants', \RomegaDigital\MultitenancyNovaTool\Tenant::class), ]; }
在每个可租户化的Nova资源中,都需要一个BelongsTo
字段,以便看到与Tenant
模型的关系
use Laravel\Nova\Fields\BelongsTo; public function fields(Request $request) { return [ // ... BelongsTo::make('Tenants', 'tenant', \RomegaDigital\MultitenancyNovaTool\Tenant::class), ]; }
定义反向关系
为了显示与Tenant
模型的所有相关数据,您需要首先实现一个扩展软件包提供的模型的Tenant
模型。
// in app/Tenant.php namespace App\Models; use RomegaDigital\Multitenancy\Models\Tenant as TenantModel; class Tenant extends TenantModel { // ... define relationships public function products() { return $this->hasMany(\App\Product::class); } }
接下来,更新您的配置文件以指向您的新模型。
// in config/multitenancy.php // ... 'tenant_model' => \App\Models\Tenant::class,
然后创建一个扩展软件包资源的租户Nova资源。
// in app/Nova/Tenant.php namespace App\Nova; use Illuminate\Http\Request; use Laravel\Nova\Fields\HasMany; use RomegaDigital\MultitenancyNovaTool\Tenant as TenantResource; class Tenant extends TenantResource { public static $model = \App\Models\Tenant::class; /** * Get the fields displayed by the resource. * * @param \Illuminate\Http\Request $request * @return array */ public function fields(Request $request) { return array_merge(parent::fields($request), [ // ... define relationships HasMany::make('Products'), ]); } }
中间件
为了将Nova结果范围限定为正在使用的租户,请向Nova添加中间件
// in config/nova.php // ... 'middleware' => [ // ... \RomegaDigital\Multitenancy\Middleware\TenantMiddleware::class, \Vyuldashev\NovaPermission\ForgetCachedPermissions::class, ],
在admin
子域名中访问Nova将删除范围并显示所有结果。只有获得正确权限的用户,例如超级管理员
,才能访问此子域名。
策略
默认情况下,多租户资源将仅在具有适当访问权限的用户(例如超级管理员
)的admin
子域名中可见。您可以通过在项目中定义策略来覆盖策略,以允许对资源有更多的访问权限。然后在您的AuthServiceProvider
中注册策略
// in app/Providers/AuthServiceProvider.php // ... protected $policies = [ // ... \RomegaDigital\Multitenancy\Models\Tenant::class => \App\Policies\TenantPolicy::class, ];
您可以通过在config/multitenancy.php
文件中设置策略文件来覆盖权限和角色模型策略。查找policies.role
和policies.permission
。