logo

注册指标

概述

定义指标后,就可以将其附加到资源。Nova 生成的每个资源都包含一个 cards 方法。要将指标附加到资源,只需将其添加到此方法返回的指标/卡片数组中即可

php
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 方法实例化指标

php
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 方法

php
/**
 * 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 属性

php
use App\Models\Podcast;

return $this->count($request, Podcast::where('user_id', $request->resourceId));

仪表盘指标

您也可以自由地将指标添加到您的主要 Nova "仪表盘",这是 Nova 在登录后显示的默认页面。默认情况下,此页面通过内置的 Help 卡片显示一些指向 Nova 文档的有用链接。要将指标添加到仪表盘,请将指标添加到 app/Nova/Dashboards/Maincards 方法返回的卡片数组中

php
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 方法接受一个闭包,该闭包应返回 truefalse。闭包将接收传入的 HTTP 请求

php
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 方法相同的函数签名

php
return [
    (new Metrics\UsersPerDay)->canSeeWhen(
        'viewUsersPerDay', User::class
    ),
];

默认指标范围

您可能希望默认情况下最初加载某个指标范围。您可以将范围的数组键传递给指标的 defaultRange 方法来实现此目的

php
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 方法

php
/**
 * 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 时,卡片的高度将变为动态。您可以通过调用 fixedHeightdynamicHeight 方法来明确定义此行为

php
/**
 * 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 允许您定义一个帮助文本“工具提示”,它可以与 字段帮助文本 类似地注册

Metric Help Tooltip

要启用工具提示,请在注册指标时调用 help 方法。help 方法接收帮助文本作为其唯一参数

php
/**
 * 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 方法

php
(new TotalUsers)
    ->help(view('nova.metrics.total-users.tooltip')->render()),

刷新指标

Laravel Nova 将自动获取更新的结果(无需用户刷新页面)以用于附加到资源的指标,这些指标基于以下事件

事件行为
资源已删除自动更新
资源已恢复自动更新
执行了操作仅在注册期间调用指标的 refreshWhenActionsRun 方法时才更新
过滤器更改仅在注册期间调用指标的 refreshWhenFiltersChange 方法时才更新

操作后刷新

默认情况下,Nova 不会在操作执行后自动更新指标结果,而不会让用户手动刷新页面;但是,您可以通过在注册指标时调用 refreshWhenActionsRun 方法来指示指标应在操作执行后自动刷新

php
public function cards(NovaRequest $request)
{
    return [
        TotalUsers::make()->refreshWhenActionsRun(),
    ];
}

过滤器更改后刷新

同样,只有在注册指标时调用指标的 refreshWhenFiltersChange 方法时,Laravel Nova 才会在页面所选过滤器更改时自动更新指标的值

php
public function cards(NovaRequest $request)
{
    return [
        TotalUsers::make()->refreshWhenFiltersChange(),
    ];
}