定义完操作后,就可以将其附加到资源。Nova 生成的每个资源都包含一个 actions
方法。要将操作附加到资源,只需将其添加到此方法返回的操作数组中即可
/**
* 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
方法的任何参数都将传递给操作的构造函数
/**
* 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
方法接受一个闭包,该闭包应返回 true
或 false
。闭包将接收传入的 HTTP 请求
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
);
}),
];
}
还可以使用各种请求方法来获取当前选定的资源
方法 | 返回类型 | 描述 |
---|---|---|
allResourcesSelected | bool | 如果选择了“全选”,则返回 true 。 |
selectedResourceIds | \Illuminate\Support\Collection|null | 如果选择了“全选”,则返回 null ,否则返回选定资源 ID 的集合。 |
selectedResources | \Illuminate\Support\Collection|null | 如果选择了“全选”,则返回 null ,否则返回资源模型的集合。 |
有时,用户可能能够“看到”操作的存在,但只能对某些资源“运行”该操作。可以使用 canRun
方法与 canSee
方法结合使用,在这种情况下完全控制授权。传递给 canRun
方法的回调接收传入的 HTTP 请求以及用户想要对其运行操作的模型
/**
* 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);
}),
];
}
除了 canSee
和 canRun
授权方法之外,Nova 还将确定资源的相应模型策略是否具有 runAction
和 runDestructiveAction
方法。最后,Nova 将根据模型的策略方法确定用户是否有权 update
模型,或者在破坏性操作的情况下 delete
模型。
授权执行 Nova 操作的优先级可以通过以下步骤列表来解释
canRun
方法,则使用该方法的返回值。runAction
或 runDestructiveAction
方法,则使用这些方法的返回值。update
或 delete
方法,则使用这些方法的返回值。false
。默认情况下,操作在资源索引和详细信息页面上都可见。但是,您可以在将操作注册到特定资源时,通过在操作上调用以下方法之一来自定义操作的可见性
onlyOnIndex
exceptOnIndex
showOnIndex
onlyOnDetail
exceptOnDetail
showOnDetail
onlyInline
exceptInline
showInline
内联操作是在给定资源的索引表格行上直接显示的操作。您可以在将操作附加到资源时调用 showInline
方法来指定操作应该在内联中可用
/**
* 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
方法中接收一个空的模型集合
/**
* 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
方法中接收一个集合,但该集合将只包含一个模型
/**
* 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
方法
BelongsToMany::make('Roles')
->actions(fn () => [new Actions\MarkAsActive]),
将操作附加到字段后,您将能够从父资源详细信息页面上的关系索引中选择操作并执行操作。
默认情况下,操作下拉菜单中的枢纽操作将被分组为“枢纽”,但您可以使用referToPivotAs
方法自定义此名称。
BelongsToMany::make('Roles')
->actions(fn () => [new Actions\MarkAsActive])
->referToPivotAs('Role Assignment'),
闭包操作允许您创建操作,而无需将操作定义为单独的类。要定义闭包操作,请在Action
类上调用using
工厂方法,并传递操作名称和闭包。传递给using
方法的闭包接收与专用操作的handle
方法相同的参数。
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。
public function actions()
{
return [
Action::redirect('Visit Stripe Dashboard', 'https://stripe.com')->standalone(),
];
}
visit
操作将用户推送到 Nova 内部的页面。要创建visit
操作,请传递操作名称和您希望他们访问的路径。
use Laravel\Nova\Nova;
public function actions()
{
return [
Action::visit('View Logs', Nova::url('/logs'))->standalone(),
];
}
danger
操作向用户显示错误提示通知。例如,您的 Nova 应用程序可能有一个以前可用的操作,但现在不可用,为了避免混淆,您可能希望通知用户已将其删除。为此,请传递操作名称和要显示给用户的消息。
public function actions()
{
return [
Action::danger('Disable User Account', 'This action is no longer available!'),
];
}
modal
操作允许您向用户显示自定义模态。要创建modal
操作,请传递操作名称、您的自定义 Vue 组件以及应提供给组件的任何其他数据。
public function actions()
{
return [
Action::modal('Download User Summary', 'UserSummary', function ($user) {
return [
'user_id' => $user->getKey(),
];
})->sole(),
];
}
openInNewTab
操作会在新的浏览器标签页中打开一个 URL。要创建 openInNewTab
操作,请传递操作名称和要在新浏览器标签页中打开的 URL。
public function actions()
{
return [
Action::openInNewTab('Visit Stripe Dashboard', 'https://stripe.com')->standalone(),
];
}
您还可以通过定义唯一操作来配置 URL 对资源的唯一性。
Action::openInNewTab('Visit User Profile', function ($user) {
return route('user.profile', $user);
})->sole(),
downloadUrl
操作会下载给定 URL 上的文件。要创建 downloadUrl
操作,请传递操作名称和要下载的文件的 URL。
public function actions()
{
return [
Action::downloadUrl('Download Users Summaries', function () {
return route('users.summaries');
})->standalone(),
];
}
运行操作时,通常会向用户显示一个确认模态框,让他们有机会取消挂起的操作。要指示确认模态框应以全屏显示,您可以在将操作注册到给定资源时调用 fullscreen
方法。
/**
* 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
方法进一步自定义自定义模态框的最大宽度。
/**
* 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
方法。
/**
* 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()
];
}