为 edit() VIEW 和 update() METHOD 重用 FormRequest authorize()

Reuse FormRequest authorize() for both edit() VIEW and update() METHOD

根据 Laravel 8 的文档,我可以创建自定义 FormRequest 并将我的验证/授权逻辑放在那里。这适用于 storeupdate 等路线。但在真正到达 update 路线之前,必须在 edit 路线上按保存(编辑 view)。

因此对于 edit 路线。没有什么要验证的(还),因为这是用户将数据输入表单以进行验证的地方(稍后)。但是为了决定用户是否甚至可以访问 edit 表单,我可以在表单中重用 authorize() 方法中的相同逻辑。

那么如何为 edit view route 重用自定义 FormRequest 中的 authorize() 位?

public function authorize()
{
    return $this->user()->can('update', $this->comment);
}

或者没有办法做到这一点,我必须 rewrite/duplicate 下面这行吗?

return $this->user()->can('update', $this->comment);

因为基本上它取决于您可以使用授权方法的不同方式,因为您可以根据需要直接调用特定方法。

public function update(Request $request, Post $post)
{
    $this->authorize('update', [$post, $request->category]);

    // The current user can update the blog post...
}

一个解决方案可能是创建一个 PostRequest(或任何适合您的情况的名称),然后处理授权和规则,具体取决于所使用的方法。虽然可能不是最佳实践,但它可以帮助减少代码混乱。

如下例所示,只有 POST 请求会在验证中检查所需评论,而您仍然可以访问编辑和查看路由而无需任何验证。

public function authorize()
{
    switch ($this->method()) {
        case 'GET':
            $this->user()->can('update', $this->comment);
            break;
        case 'POST':
            break;
        case 'PUT':
            break;
        case 'PATCH':
            break;
        case 'DELETE':
            break;
    }

    return true;
}

public function rules()
{
    switch ($this->method()) {
        case 'GET':
            return [];
        case 'POST':
            return [
                'comment' => 'required'
            ];
        case 'PUT':
            return [];
        case 'PATCH':
            return [];
        case 'DELETE':
            return [];
        default:
            return [];
    }
}