资源工具与 自定义工具)非常相似;不过,资源工具不是列在 Nova 侧边栏中,而是显示在特定资源的详细页面上。与 Nova 工具一样,资源工具也是可定制的,主要由一个完全由你控制的单一文件 Vue 组件组成。
可使用 nova:resource-tool Artisan 命令生成资源工具。默认情况下,所有新工具都将放在应用程序的 nova-components 目录中。使用 nova:resource-tool 命令生成工具时,传递给命令的工具名称应遵循 Composer vendor/package 格式。因此,如果我们要构建一个 Stripe 检查器工具,可以运行以下命令:
php artisan nova:resource-tool acme/stripe-inspector生成工具时,Nova 会提示你安装工具的 NPM 依赖项、编译其资源并更新应用程序的 composer.json 文件。所有自定义工具都会作为 Composer 「路径」存储库 与应用程序一起注册。
Nova 资源工具包括构建工具所需的所有脚手架。每个工具甚至都包含自己的 composer.json 文件,可以在 GitHub 或你选择的源控制提供商上与全世界共享。
Nova 资源工具可在资源的 fields 方法中注册。该方法返回资源可用的字段和工具数组。要注册资源工具,请将工具添加到此方法返回的字段数组中:
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 方法接受一个闭包,该闭包应返回 true 或 false。闭包将接收传入的 HTTP 请求:
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
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 props:resourceName、resourceId 和 panel。resourceId 属性包含工具当前所连接资源的主键。在向控制器发出请求时,你可以使用 resourceId。panel 属性提供了对任何可通过 fields 字段获得的工具选项的访问:
const issuesRefunds = this.panel.fields[0].issuesRefunds;资源工具还提供了动态设置工具选项的功能,无需设置方法,只需在注册工具时将所需选项作为方法调用即可。如果调用时带有参数,该参数将被设置为选项的值:
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/js 和 resources/css 目录。这些目录包含工具的 JavaScript 和 CSS。这些目录中值得关注的主要文件有 resources/js/components/Tool.vue 和 resources/css/tool.css。
Tool.vue 文件是一个包含工具前端的单文件 Vue 组件。通过该文件,你可以随意构建你的工具。你的工具可通过 Nova.request 使用 Axios 发送 HTTP 请求。
Nova 工具的服务提供商会注册工具的编译资源,以便 Nova 前端可以使用这些资源:
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 dev 和 prod 命令构建你的工具:
# 为本地开发编译资源...
npm run dev
# 编译并最小化资源...
npm run prod此外,你还可以运行 NPM watch 命令,在资产发生变化时自动编译它们:
npm run watch