logo

注册操作

定义完操作后,就可以将其附加到资源。Nova 生成的每个资源都包含一个 actions 方法。要将操作附加到资源,只需将其添加到此方法返回的操作数组中即可

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        new Actions\EmailAccountProfile
    ];
}

或者,可以使用 make 方法实例化操作。传递给 make 方法的任何参数都将传递给操作的构造函数

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        Actions\EmailAccountProfile::make()
    ];
}

授权

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

php
use App\Models\User;
use Laravel\Nova\Http\Requests\NovaRequest;

/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        (new Actions\EmailAccountProfile)->canSee(function ($request) {
            return $request->user()->can(
                'emailAnyAccountProfile', User::class
            );
        }),
    ];
}

还可以使用各种请求方法来获取当前选定的资源

方法返回类型描述
allResourcesSelectedbool如果选择了“全选”,则返回 true
selectedResourceIds\Illuminate\Support\Collection|null如果选择了“全选”,则返回 null,否则返回选定资源 ID 的集合。
selectedResources\Illuminate\Support\Collection|null如果选择了“全选”,则返回 null,否则返回资源模型的集合。

资源特定授权

有时,用户可能能够“看到”操作的存在,但只能对某些资源“运行”该操作。可以使用 canRun 方法与 canSee 方法结合使用,在这种情况下完全控制授权。传递给 canRun 方法的回调接收传入的 HTTP 请求以及用户想要对其运行操作的模型

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        (new Actions\EmailAccountProfile)->canSee(function ($request) {
            return true;
        })->canRun(function ($request, $user) {
            return $request->user()->can('emailAccountProfile', $user);
        }),
    ];
}

通过资源策略进行授权

除了 canSeecanRun 授权方法之外,Nova 还将确定资源的相应模型策略是否具有 runActionrunDestructiveAction 方法。最后,Nova 将根据模型的策略方法确定用户是否有权 update 模型,或者在破坏性操作的情况下 delete 模型。

授权执行 Nova 操作的优先级可以通过以下步骤列表来解释

  1. 如果定义了操作的 canRun 方法,则使用该方法的返回值。
  2. 如果定义了底层模型策略的 runActionrunDestructiveAction 方法,则使用这些方法的返回值。
  3. 如果定义了底层模型策略的 updatedelete 方法,则使用这些方法的返回值。
  4. 否则,返回 false

操作可见性

默认情况下,操作在资源索引和详细信息页面上都可见。但是,您可以在将操作注册到特定资源时,通过在操作上调用以下方法之一来自定义操作的可见性

  • onlyOnIndex
  • exceptOnIndex
  • showOnIndex
  • onlyOnDetail
  • exceptOnDetail
  • showOnDetail
  • onlyInline
  • exceptInline
  • showInline

内联操作

内联操作是在给定资源的索引表格行上直接显示的操作。您可以在将操作附加到资源时调用 showInline 方法来指定操作应该在内联中可用

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        (new ConsolidateTransaction())->showInline()
    ];
}

独立操作

通常,操作针对在资源索引或详细信息页面上选择的资源执行。但是,有时您可能有一个不需要任何资源/模型即可运行的操作。在这些情况下,您可以在注册操作时调用 standalone 方法将操作注册为“独立”操作。这些操作始终在其 handle 方法中接收一个空的模型集合

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        Actions\InviteUser::make()->standalone()
    ];
}

单独操作

有时您可能有一些操作,这些操作应该只对单个资源/模型运行。通过将操作注册为 sole 操作,Nova 将仅在选择单个资源时显示该操作。单独操作仍然在其 handle 方法中接收一个集合,但该集合将只包含一个模型

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        Actions\BanUser::make()->sole()
    ];
}

枢轴操作

通常,操作在资源上运行。但是,您也可以将操作附加到 belongsToMany 字段,以便它们可以在枢轴/中间表记录上运行。为此,您可以在字段定义上链接 actions 方法

php
BelongsToMany::make('Roles')
    ->actions(fn () => [new Actions\MarkAsActive]),

将操作附加到字段后,您将能够从父资源详细信息页面上的关系索引中选择操作并执行操作。

自定义枢纽操作名称

默认情况下,操作下拉菜单中的枢纽操作将被分组为“枢纽”,但您可以使用referToPivotAs方法自定义此名称。

php
BelongsToMany::make('Roles')
    ->actions(fn () => [new Actions\MarkAsActive])
    ->referToPivotAs('Role Assignment'),

闭包操作

闭包操作允许您创建操作,而无需将操作定义为单独的类。要定义闭包操作,请在Action类上调用using工厂方法,并传递操作名称和闭包。传递给using方法的闭包接收与专用操作的handle方法相同的参数。

php
public function actions()
{
    return [
        Action::using('Deactivate User', function (ActionFields $fields, Collection $models) {
            $models->each->update(['active' => false]);
        }),
    ];
}

排队闭包操作

闭包操作不可排队,因为它们无法使用 Laravel 提供的ShouldQueue特性。

静态操作

使用 Nova 时,通常会定义操作来完成简单的任务,例如下载文件、重定向用户或打开新窗口。幸运的是,Nova 提供了静态操作,允许您完成各种常见任务,而无需编写自己的专用操作。

重定向操作

redirect操作将用户重定向到外部 URL。要创建redirect操作,请传递操作名称和您要将用户重定向到的 URL。

php
public function actions()
{
    return [
        Action::redirect('Visit Stripe Dashboard', 'https://stripe.com')->standalone(),
    ];
}

访问操作

visit操作将用户推送到 Nova 内部的页面。要创建visit操作,请传递操作名称和您希望他们访问的路径。

php
use Laravel\Nova\Nova;

public function actions()
{
    return [
        Action::visit('View Logs', Nova::url('/logs'))->standalone(),
    ];
}

危险操作

danger操作向用户显示错误提示通知。例如,您的 Nova 应用程序可能有一个以前可用的操作,但现在不可用,为了避免混淆,您可能希望通知用户已将其删除。为此,请传递操作名称和要显示给用户的消息。

php
public function actions()
{
    return [
        Action::danger('Disable User Account', 'This action is no longer available!'),
    ];
}

自定义模态操作

modal操作允许您向用户显示自定义模态。要创建modal操作,请传递操作名称、您的自定义 Vue 组件以及应提供给组件的任何其他数据。

php
public function actions()
{
    return [
        Action::modal('Download User Summary', 'UserSummary', function ($user) {
            return [
                'user_id' => $user->getKey(),
            ];
        })->sole(),
    ];
}

在新标签页中打开 URL

openInNewTab 操作会在新的浏览器标签页中打开一个 URL。要创建 openInNewTab 操作,请传递操作名称和要在新浏览器标签页中打开的 URL。

php
public function actions()
{
    return [
        Action::openInNewTab('Visit Stripe Dashboard', 'https://stripe.com')->standalone(),
    ];
}

您还可以通过定义唯一操作来配置 URL 对资源的唯一性。

php
Action::openInNewTab('Visit User Profile', function ($user) {
    return route('user.profile', $user);
})->sole(),

下载文件

downloadUrl 操作会下载给定 URL 上的文件。要创建 downloadUrl 操作,请传递操作名称和要下载的文件的 URL。

php
public function actions()
{
    return [
        Action::downloadUrl('Download Users Summaries', function () {
            return route('users.summaries');
        })->standalone(),
    ];
}

操作确认模态框

全屏/自定义模态框大小

运行操作时,通常会向用户显示一个确认模态框,让他们有机会取消挂起的操作。要指示确认模态框应以全屏显示,您可以在将操作注册到给定资源时调用 fullscreen 方法。

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        Actions\EmailAccountProfile::make()->fullscreen()
    ];
}

或者,您还可以使用 size 方法进一步自定义自定义模态框的最大宽度。

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        // "sm", "md", "lg", "xl", "2xl", "3xl", "4xl", "5xl", "6xl", or "7xl"...
        Actions\EmailAccountProfile::make()->size('7xl')
    ];
}

禁用操作确认

要禁用操作确认模态框并立即运行操作,您可以在将操作注册到给定资源时调用 withoutConfirmation 方法。

php
/**
 * Get the actions available for the resource.
 *
 * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
 * @return array
 */
public function actions(NovaRequest $request)
{
    return [
        Actions\EmailAccountProfile::make()->withoutConfirmation()
    ];
}