使资源详细信息页面的操作可选
Make action optional for resource details page
假设我对 Product
资源有操作 "Ban",并且 Product
模型有 is_banned
字段。 Product
已被禁止 (is_banned=1
) 的详细信息页面上无需显示 "Ban" 操作。
Laravel Nova 文档提供了根据管理员是否有权执行隐藏操作的示例:
public function actions(Request $request)
{
return [
(new Actions\EmailAccountProfile)->canSee(function ($request) {
return $request->user()->can(
'emailAnyAccountProfile', User::class
);
}),
];
}
但它没有涵盖当在单个资源的上下文中(在其详细信息页面上)调用此方法时,如何在我为 canSee
解决方案提供的闭包中获取当前资源的模型实例。
actions()
方法是我们注册可用操作的地方,在我的例子中属于 Product
Nova 资源 class,但它无法访问 Eloquent 模型的上下文都不是。
如何实现?
经过一些调试后,我发现资源的 actions()
方法接收具有 findModelOrFail()
方法和单个资源的 Laravel\Nova\Http\Requests\NovaRequest
实例(例如,当查看资源的详细信息页面时)请求还获取 resourceId
参数。
因此,根据请求中 resourceId
的存在,我现在可以确定我是否处于单一资源操作的上下文中。然后我将使用此 id 获取资源的模型并检查它的 is_banned
属性以解析资源的可用操作。
我的动作解析逻辑最终是:
public function actions(Request $request)
{
if ($request->resourceId !== null) {
$product = $request->findModelOrFail($request->resourceId);
if ($product->is_banned) {
return [];
}
}
return [new Actions\BanProduct];
}
请注意,findModelOrFail()
方法可以在没有 $resourceId
参数的情况下调用,并且在这种情况下会自动从请求中获取 resourceId
值,但直接指定时代码的意图更清晰。
假设我对 Product
资源有操作 "Ban",并且 Product
模型有 is_banned
字段。 Product
已被禁止 (is_banned=1
) 的详细信息页面上无需显示 "Ban" 操作。
Laravel Nova 文档提供了根据管理员是否有权执行隐藏操作的示例:
public function actions(Request $request)
{
return [
(new Actions\EmailAccountProfile)->canSee(function ($request) {
return $request->user()->can(
'emailAnyAccountProfile', User::class
);
}),
];
}
但它没有涵盖当在单个资源的上下文中(在其详细信息页面上)调用此方法时,如何在我为 canSee
解决方案提供的闭包中获取当前资源的模型实例。
actions()
方法是我们注册可用操作的地方,在我的例子中属于 Product
Nova 资源 class,但它无法访问 Eloquent 模型的上下文都不是。
如何实现?
经过一些调试后,我发现资源的 actions()
方法接收具有 findModelOrFail()
方法和单个资源的 Laravel\Nova\Http\Requests\NovaRequest
实例(例如,当查看资源的详细信息页面时)请求还获取 resourceId
参数。
因此,根据请求中 resourceId
的存在,我现在可以确定我是否处于单一资源操作的上下文中。然后我将使用此 id 获取资源的模型并检查它的 is_banned
属性以解析资源的可用操作。
我的动作解析逻辑最终是:
public function actions(Request $request)
{
if ($request->resourceId !== null) {
$product = $request->findModelOrFail($request->resourceId);
if ($product->is_banned) {
return [];
}
}
return [new Actions\BanProduct];
}
请注意,findModelOrFail()
方法可以在没有 $resourceId
参数的情况下调用,并且在这种情况下会自动从请求中获取 resourceId
值,但直接指定时代码的意图更清晰。