jeffersonsimaogoncalves / multitenancy-nova-tool
一个用于管理多租户的Laravel Nova工具。
Requires
- php: ^7.4|^8.0
- jeffersonsimaogoncalves/multitenancy: ^3.0
- jeffersonsimaogoncalves/nova-permission: ^4.0
README
此包旨在与Multitenancy Package集成,以将多租户功能和管理引入Laravel的Nova。
此包自动包含Multitenancy Package作为依赖项。请阅读文档了解如何将其集成到现有应用程序中。
安装
通过Composer安装此包
composer require jeffersonsimaogoncalves/multitenancy-nova-tool
然后按照安装说明设置Multitenancy Package。
接下来,您必须将工具注册到Nova中。这通常在NovaServiceProvider
的tools
方法中完成。
// in app/Providers/NovaServiceProvider.php public function tools() { return [ // ... new \JeffersonSimaoGoncalves\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', \JeffersonSimaoGoncalves\MultitenancyNovaTool\Tenant::class), ]; }
在每个可租户化的Nova资源中,都需要一个BelongsTo
字段,以便查看与Tenant
模型的关系
use Laravel\Nova\Fields\BelongsTo; public function fields(Request $request) { return [ // ... BelongsTo::make('Tenants', 'tenant', \JeffersonSimaoGoncalves\MultitenancyNovaTool\Tenant::class), ]; }
定义反向关系
为了显示所有与Tenant
模型相关的数据,您需要首先实现一个扩展包提供的模型的Tenant
模型。
// in app/Tenant.php namespace App; use JeffersonSimaoGoncalves\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\Tenant::class,
然后创建一个扩展包资源的租户Nova资源。
// in app/Nova/Tenant.php namespace App\Nova; use Illuminate\Http\Request; use Laravel\Nova\Fields\HasMany; use JeffersonSimaoGoncalves\MultitenancyNovaTool\Tenant as TenantResource; class Tenant extends TenantResource { public static $model = \App\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' => [ // ... \JeffersonSimaoGoncalves\Multitenancy\Middleware\TenantMiddleware::class, ],
在admin
子域名下访问Nova将删除范围并显示所有结果。只有获得正确权限的用户,例如超级管理员
,才能访问此子域名。
策略
默认情况下,多租户资源将仅对具有适当访问权限的用户在admin
子域名中可见。您可以通过在项目中定义策略来覆盖策略,以允许对资源有更多访问权限。然后在您的AuthServiceProvider
中注册策略
// in app/Providers/AuthServiceProvider.php // ... protected $policies = [ // ... \JeffersonSimaoGoncalves\Multitenancy\Models\Tenant::class => \App\Policies\TenantPolicy::class, ];
您可以通过在config/multitenancy.php
文件中设置策略文件来覆盖权限和角色模型策略。查找policies.role
和policies.permission
。
报告问题
如果您在此插件或任何错误中遇到问题,请请在GitHub上打开一个问题。
鸣谢
此作品基于RomegaDigital的代码。