logo

资源工具

概述

资源工具与 自定义工具)非常相似;不过,资源工具不是列在 Nova 侧边栏中,而是显示在特定资源的详细页面上。与 Nova 工具一样,资源工具也是可定制的,主要由一个完全由你控制的单一文件 Vue 组件组成。

定义工具

可使用 nova:resource-tool Artisan 命令生成资源工具。默认情况下,所有新工具都将放在应用程序的 nova-components 目录中。使用 nova:resource-tool 命令生成工具时,传递给命令的工具名称应遵循 Composer vendor/package 格式。因此,如果我们要构建一个 Stripe 检查器工具,可以运行以下命令:

bash
php artisan nova:resource-tool acme/stripe-inspector

生成工具时,Nova 会提示你安装工具的 NPM 依赖项、编译其资源并更新应用程序的 composer.json 文件。所有自定义工具都会作为 Composer 「路径」存储库 与应用程序一起注册。

Nova 资源工具包括构建工具所需的所有脚手架。每个工具甚至都包含自己的 composer.json 文件,可以在 GitHub 或你选择的源控制提供商上与全世界共享。

注册工具

Nova 资源工具可在资源的 fields 方法中注册。该方法返回资源可用的字段和工具数组。要注册资源工具,请将工具添加到此方法返回的字段数组中:

php
use Acme\StripeInspector\StripeInspector;

/**
 * 获取资源显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        ID::make()->sortable(),

        StripeInspector::make(),
    ];
}

授权

如果你只想向特定用户公开某个工具,可以在注册工具时调用 canSee 方法。canSee 方法接受一个闭包,该闭包应返回 truefalse。闭包将接收传入的 HTTP 请求:

php
use Acme\StripeInspector\StripeInspector;

/**
 * 获取资源显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        ID::make('ID', 'id')->sortable(),

        StripeInspector::make()->canSee(function ($request) {
            return $request->user()->managesBilling();
        }),
    ];
}

工具选项

通常,你需要允许工具的用户自定义工具的运行时配置选项。为此,你可以在工具类中公开一些方法。这些方法可调用工具底层的 withMeta 方法,以向工具的元数据中添加信息,这些信息将在你的 Tool.vue 组件中提供。withMeta 方法接受一个 键/值 选项数组:

php
<?php

namespace Acme\StripeInspector;

use Laravel\Nova\ResourceTool;

class StripeInspector extends ResourceTool
{
    /**
     * 获取资源工具的可显示名称。
     *
     * @return string
     */
    public function name()
    {
        return 'Stripe Inspector';
    }

    /**
     * 表示 Stripe 检查员应允许退款。
     *
     * @return $this
     */
    public function issuesRefunds()
    {
        return $this->withMeta(['issuesRefunds' => true]);
    }

    /**
     * 获取资源工具的组件名称。
     *
     * @return string
     */
    public function component()
    {
        return 'stripe-inspector';
    }
}

获取工具选项

资源工具的 Tool.vue 组件会接收多个 Vue propsresourceNameresourceIdpanelresourceId 属性包含工具当前所连接资源的主键。在向控制器发出请求时,你可以使用 resourceIdpanel 属性提供了对任何可通过 fields 字段获得的工具选项的访问:

js
const issuesRefunds = this.panel.fields[0].issuesRefunds;

动态选项

资源工具还提供了动态设置工具选项的功能,无需设置方法,只需在注册工具时将所需选项作为方法调用即可。如果调用时带有参数,该参数将被设置为选项的值:

php
use Acme\StripeInspector\StripeInspector;

/**
 * 获取资源显示的字段。
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function fields(NovaRequest $request)
{
    return [
        ID::make('ID', 'id')->sortable(),

        StripeInspector::make()->issuesRefunds(),
    ];
}

创建工具

Nova 生成的每个工具都有自己的服务提供者和「工具」类。以 stripe-inspector 工具为例,工具类将位于 src/StripeInspector.php

工具的服务提供者也位于工具的 src 目录中,并在工具的 composer.json 文件的 extra 部分注册,以便 Laravel 自动加载。

路由

通常,你需要定义工具调用的 Laravel 路由。Nova 在生成你的工具时,会创建一个 routes/api.php 路由文件。如有需要你可以使用该文件定义工具所需的路由。

该文件中的所有路由都由工具的 ToolServiceProvider 自动定义在路由组内。路由组指定组内的所有路由都应使用 /nova-vendor/tool-name 前缀,其中 tool-name 是工具的「kebab-case」 名称。例如,/nova-vendor/stripe-inspector。你可以自由修改路由组定义,但要注意确保你的 Nova 工具能与其他 Nova 软件包共存。

路由授权

在为工具创建路由时,使用 Laravel 网关或策略为这些路由添加授权。

资源

Nova 生成工具时,会为你生成 resources/jsresources/css 目录。这些目录包含工具的 JavaScript 和 CSS。这些目录中值得关注的主要文件有 resources/js/components/Tool.vueresources/css/tool.css

Tool.vue 文件是一个包含工具前端的单文件 Vue 组件。通过该文件,你可以随意构建你的工具。你的工具可通过 Nova.request 使用 Axios 发送 HTTP 请求。

注册资源

Nova 工具的服务提供商会注册工具的编译资源,以便 Nova 前端可以使用这些资源:

php
use Laravel\Nova\Nova;
use Laravel\Nova\Events\ServingNova;

/**
 * 引导任何应用服务。
 *
 * @return void
 */
public function boot()
{
    $this->app->booted(function () {
        $this->routes();
    });

    Nova::serving(function (ServingNova $event) {
        Nova::script('stripe-inspector', __DIR__.'/../dist/js/tool.js');
        Nova::style('stripe-inspector', __DIR__.'/../dist/css/tool.css');
    });
}

JavaScript 引导和路由

你的组件将在 resources/js/tool.js 文件中引导和注册。你可以根据需要修改该文件或在此注册其他组件。

编译资源

Nova 资源工具包含一个 webpack.mix.js 文件,该文件在 Nova 创建工具时生成。你可以使用 NPM devprod 命令构建你的工具:

bash
# 为本地开发编译资源...
npm run dev

# 编译并最小化资源...
npm run prod

此外,你还可以运行 NPM watch 命令,在资产发生变化时自动编译它们:

bash
npm run watch