为 edit() VIEW 和 update() METHOD 重用 FormRequest authorize()
Reuse FormRequest authorize() for both edit() VIEW and update() METHOD
根据 Laravel 8 的文档,我可以创建自定义 FormRequest 并将我的验证/授权逻辑放在那里。这适用于 store
和 update
等路线。但在真正到达 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 [];
}
}
根据 Laravel 8 的文档,我可以创建自定义 FormRequest 并将我的验证/授权逻辑放在那里。这适用于 store
和 update
等路线。但在真正到达 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 [];
}
}