romegadigital/multitenancy-nova-tool

一个用于管理多租户的Laravel Nova工具。

4.0.0 2023-05-31 23:40 UTC

This package is auto-updated.

Last update: 2024-09-30 01:34:33 UTC


README

Total Downloads

本软件包旨在与多租户软件包集成,以将多租户功能和管理工作引入Laravel的Nova

本软件包会自动包含多租户软件包作为依赖项。请阅读文档了解如何将其与现有应用集成。

index

create

安装

使用Composer安装软件包

composer require romegadigital/multitenancy-nova-tool

然后按照安装说明设置多租户软件包。

接下来,您必须使用Nova注册工具。这通常在NovaServiceProvidertools方法中完成。

// 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.rolepolicies.permission