【问题标题】:Make action optional for resource details page使资源详细信息页面的操作可选
【发布时间】:2019-01-18 09:53:04
【问题描述】:

假设我对Product 资源和Product 模型有is_banned 字段的“禁止”操作。已被禁止的Productis_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() 方法是我们注册可用操作的地方,在我的例子中属于 Product Nova 资源类,但它也无法访问 Eloquent 模型的上下文。

如何做到这一点?

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案1】:

    在进行了一些调试后,我发现资源的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值,但是直接指定时代码的意图更清晰。

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      相关资源
      最近更新 更多