定义指标后,就可以将其附加到资源。Nova 生成的每个资源都包含一个 cards
方法。要将指标附加到资源,只需将其添加到此方法返回的指标/卡片数组中即可
use App\Nova\Metrics\UsersPerDay;
use Laravel\Nova\Http\Requests\NovaRequest;
/**
* Get the cards available for the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
new UsersPerDay
];
}
或者,可以使用 make
方法实例化指标
use App\Nova\Metrics\UsersPerDay;
use Laravel\Nova\Http\Requests\NovaRequest;
/**
* Get the cards available for the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
UsersPerDay::make()
];
}
传递给 make
方法的任何参数都将传递给指标的构造函数。
除了将指标放置在资源索引页面上之外,还可以将指标附加到资源详细信息页面。例如,如果您正在构建一个播客应用程序,您可能希望显示特定用户创建的播客总数随时间的变化。要指示指标显示在详细信息页面而不是索引页面上,请在注册指标时调用 onlyOnDetail
方法
/**
* Get the cards available for the request.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
(new Metrics\PodcastCount)->onlyOnDetail(),
];
}
当然,您需要修改指标的查询,以仅收集当前显示的资源的指标数据。为此,指标的 calculate
方法可以访问传入 $request
上的 resourceId
属性
use App\Models\Podcast;
return $this->count($request, Podcast::where('user_id', $request->resourceId));
您也可以自由地将指标添加到您的主要 Nova "仪表盘",这是 Nova 在登录后显示的默认页面。默认情况下,此页面通过内置的 Help
卡片显示一些指向 Nova 文档的有用链接。要将指标添加到仪表盘,请将指标添加到 app/Nova/Dashboards/Main
类 cards
方法返回的卡片数组中
use App\Nova\Metrics\NewUsers;
/**
* Get the cards that should be displayed on the Nova dashboard.
*
* @return array
*/
protected function cards()
{
return [
new NewUsers,
];
}
如果您只想向特定用户公开给定指标,可以在注册指标时调用 canSee
方法。canSee
方法接受一个闭包,该闭包应返回 true
或 false
。闭包将接收传入的 HTTP 请求
use App\Models\User;
use Laravel\Nova\Http\Requests\NovaRequest;
/**
* Get the cards available for the resource.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
(new Metrics\UsersPerDay)->canSee(function ($request) {
return $request->user()->can('viewUsersPerDay', User::class);
}),
];
}
在上面的示例中,我们使用 Laravel 的 Authorizable
特征的 can
方法在我们的 User
模型上确定授权用户是否被授权执行 viewUsersPerDay
操作。但是,由于代理到授权策略方法是 canSee
的常见用例,因此可以使用 canSeeWhen
方法来实现相同的行为。canSeeWhen
方法具有与 Illuminate\Foundation\Auth\Access\Authorizable
特征的 can
方法相同的函数签名
return [
(new Metrics\UsersPerDay)->canSeeWhen(
'viewUsersPerDay', User::class
),
];
您可能希望默认情况下最初加载某个指标范围。您可以将范围的数组键传递给指标的 defaultRange
方法来实现此目的
use App\Nova\Metrics\NewUsers;
/**
* Get the cards that should be displayed on the Nova dashboard.
*
* @return array
*/
protected function cards()
{
return [
NewUsers::make()->defaultRange('YTD'),
];
}
默认情况下,指标占用 Nova 内容区域的三分之一。但是,您可以自由地使它们更大。为此,在注册指标时调用 width
方法
/**
* Get the cards available for the request.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
// Two-thirds of the content area...
(new Metrics\UsersPerDay)->width('2/3'),
// Full width...
(new Metrics\UsersPerDay)->width('full'),
];
}
当指标宽度设置为 full
时,卡片的高度将变为动态。您可以通过调用 fixedHeight
或 dynamicHeight
方法来明确定义此行为
/**
* Get the cards available for the request.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
(new Metrics\UsersPerDay)->width('full')->fixedHeight(),
(new Metrics\UsersPerDay)->width('full')->dynamicHeight(),
];
}
有时,指标需要为用户提供有关如何计算值或与指标值相关的其他详细信息的更多上下文。为了提供此上下文,Nova 允许您定义一个帮助文本“工具提示”,它可以与 字段帮助文本 类似地注册
要启用工具提示,请在注册指标时调用 help
方法。help
方法接收帮助文本作为其唯一参数
/**
* Get the cards available for the request.
*
* @param \Laravel\Nova\Http\Requests\NovaRequest $request
* @return array
*/
public function cards(NovaRequest $request)
{
return [
(new TotalUsers)
->help('This is calculated using all users that are active and not banned.'),
];
}
您也可以在定义帮助文本时使用 HTML。例如,您可以将渲染的 Blade 模板传递给 help
方法
(new TotalUsers)
->help(view('nova.metrics.total-users.tooltip')->render()),
Laravel Nova 将自动获取更新的结果(无需用户刷新页面)以用于附加到资源的指标,这些指标基于以下事件
事件 | 行为 |
---|---|
资源已删除 | 自动更新 |
资源已恢复 | 自动更新 |
执行了操作 | 仅在注册期间调用指标的 refreshWhenActionsRun 方法时才更新 |
过滤器更改 | 仅在注册期间调用指标的 refreshWhenFiltersChange 方法时才更新 |
默认情况下,Nova 不会在操作执行后自动更新指标结果,而不会让用户手动刷新页面;但是,您可以通过在注册指标时调用 refreshWhenActionsRun
方法来指示指标应在操作执行后自动刷新
public function cards(NovaRequest $request)
{
return [
TotalUsers::make()->refreshWhenActionsRun(),
];
}
同样,只有在注册指标时调用指标的 refreshWhenFiltersChange
方法时,Laravel Nova 才会在页面所选过滤器更改时自动更新指标的值
public function cards(NovaRequest $request)
{
return [
TotalUsers::make()->refreshWhenFiltersChange(),
];
}