如何用Laravel中的资源编写验证规则?
How to write validation rule with resource in Laravel?
我使用 Laravel 8 和 Resource
在我的控制器中定义 api.php 和 DestroyProductRequest
中的路由:
Route::resources([
'product' => ProductController::class,
]);
在控制器中:
public function destroy(DestroyProductRequest $request, Product $product) {
$product->delete();
return Response::HTTP_OK;
}
在DestroyProductRequest.php:
public function rules() {
return [
'id' => 'required|integer|exists:products,id',
];
}
现在的关键是 Route::resource
将传入的 id
从 url 转换为模型。但是现在如何在 rules()
函数中编写正确的规则?
现在它在错误响应中显示 id: ["The id field is required."]
。
有什么想法吗?
使用Validator
回答你的问题
use Illuminate\Support\Facades\Validator;
public function destroy(DestroyProductRequest $request, Product $product) {
$rules = [
'id' => 'required|integer|exists:products,id',
];
$messages = [
'id.required' => 'The id field is required.',
'id.integer' => 'The id field need to be integer.',
'id.exists' => 'The id field is exists.',
];
Validator::make($request->all(), $rules, $messages)->validate();
$product->delete();
return Response::HTTP_OK;
}
在此处阅读更多内容:https://laravel.com/docs/8.x/validation
由于您正在使用该资源,路由参数是隐式投标键(产品id),因此Laravel将传递的id隐式绑定为产品。更改您的规则代码段如下,
public function rules() {
return [
'product' => 'required|integer|exists:products,id',
];
}
public function destroy(Product $product) {
$product->delete();
return Response::HTTP_OK;
}
如果你想添加 ACL
if ($user->can('destroy', $product)) {
$product->delete();
return Response::HTTP_OK;
}
默认情况下Laravel不验证路由参数。
您已添加自定义逻辑才能工作
public function rules()
{
return [
'product' => 'required|integer|exists:products,id',
];
}
protected function validationData()
{
// Add the Route parameters to you data under validation
return array_merge($this->all(),$this->route()->parameters());
}
在正常用例中,您不会验证路由请求。 Laravel 会 return 一个 404 Not Found 异常。这是一个标准和适当的回应。
我使用 Laravel 8 和 Resource
在我的控制器中定义 api.php 和 DestroyProductRequest
中的路由:
Route::resources([
'product' => ProductController::class,
]);
在控制器中:
public function destroy(DestroyProductRequest $request, Product $product) {
$product->delete();
return Response::HTTP_OK;
}
在DestroyProductRequest.php:
public function rules() {
return [
'id' => 'required|integer|exists:products,id',
];
}
现在的关键是 Route::resource
将传入的 id
从 url 转换为模型。但是现在如何在 rules()
函数中编写正确的规则?
现在它在错误响应中显示 id: ["The id field is required."]
。
有什么想法吗?
使用Validator
回答你的问题
use Illuminate\Support\Facades\Validator;
public function destroy(DestroyProductRequest $request, Product $product) {
$rules = [
'id' => 'required|integer|exists:products,id',
];
$messages = [
'id.required' => 'The id field is required.',
'id.integer' => 'The id field need to be integer.',
'id.exists' => 'The id field is exists.',
];
Validator::make($request->all(), $rules, $messages)->validate();
$product->delete();
return Response::HTTP_OK;
}
在此处阅读更多内容:https://laravel.com/docs/8.x/validation
由于您正在使用该资源,路由参数是隐式投标键(产品id),因此Laravel将传递的id隐式绑定为产品。更改您的规则代码段如下,
public function rules() {
return [
'product' => 'required|integer|exists:products,id',
];
}
public function destroy(Product $product) {
$product->delete();
return Response::HTTP_OK;
}
如果你想添加 ACL
if ($user->can('destroy', $product)) {
$product->delete();
return Response::HTTP_OK;
}
默认情况下Laravel不验证路由参数。 您已添加自定义逻辑才能工作
public function rules()
{
return [
'product' => 'required|integer|exists:products,id',
];
}
protected function validationData()
{
// Add the Route parameters to you data under validation
return array_merge($this->all(),$this->route()->parameters());
}
在正常用例中,您不会验证路由请求。 Laravel 会 return 一个 404 Not Found 异常。这是一个标准和适当的回应。