代码之家  ›  专栏  ›  技术社区  ›  d3jn

使“资源详细信息”页的操作可选

  •  0
  • d3jn  · 技术社区  · 5 年前

    假设我有行动“禁止” Product 资源与 产品 模型具有 is_banned 字段。无需在的“详细信息”页上显示“禁止”操作 产品 那已经被禁止了( is_banned=1 )

    Laravel Nova文档提供了根据管理员是否有权执行隐藏操作的示例:

    public function actions(Request $request)
    {
        return [
            (new Actions\EmailAccountProfile)->canSee(function ($request) {
                return $request->user()->can(
                    'emailAnyAccountProfile', User::class
                );
            }),
        ];
    }
    

    但它不包括如何在我提供的闭包中获取当前资源的模型实例 canSee 在单个资源的上下文中调用此方法时的分辨率(在其详细信息页上)。

    actions() 方法是我们注册可用操作的地方,在我的情况下,它属于 产品 nova资源类,但它也不能访问雄辩模型的上下文。

    如何实现这一目标?

    1 回复  |  直到 5 年前
        1
  •  0
  •   d3jn    5 年前

    在做了一些调试之后,我发现资源 actions() 方法接收 Laravel\Nova\Http\Requests\NovaRequest 具有的实例 findModelOrFail() 方法和对于单个资源(例如,在查看资源的详细信息页时),请求也会 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];
    }
    

    注意 查找模型或失败() 方法不能在没有 $resourceId 参数,将自动获取 资源库 在这种情况下,来自请求的值,但是在直接指定代码时,代码的意图更清晰。