我有一个表单请求文件,与我的控制器分开处理我的验证。在控制器内调用 api 后如何返回验证错误?
//我的控制器
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function orders(GetOrdersRequest $request, OrderRepository $orderRepository)
{
$order = $orderRepository->allOrders($request->paginate);
return $this->sendSuccess('Orders retrieved successfully', $order);
}
在FormRequest类中有一个函数叫做
failedValidation
:
protected function failedValidation(Validator $validator)
{
throw (new ValidationException($validator))
->errorBag($this->errorBag)
->redirectTo($this->getRedirectUrl());
}
当您的验证失败时它会触发。对于 API 端点,此请求是一个错误的响应,因为它是重定向并且包含太多信息。归还一个干净、 轻量级 json 响应,只需在 FormRequest 中编写函数
failedValidation
即可为您的 API 提供匹配的响应。例如这样:
protected function failedValidation(Validator $validator)
{
$errors = $validator->errors();
$response = response()->json([
'message' => 'Invalid data send',
'details' => $errors->messages(),
], 422);
throw new HttpResponseException($response);
}
您将无法以这种方式获取错误,因为如果存在验证错误,FormRequest 将在请求到达控制器之前抛出异常。但是,您可以自行捕获表单请求中的错误,并使用
failedValidation
方法 修改响应
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
class OrderRequest extends FormRequest
{
public function authorize()
{
//
}
public function rules()
{
//
}
public function failedValidation(Validator $validator)
{
$errors = $validator->errors(); // Here is your array of errors
throw new HttpResponseException($errors);
}
}
Laravel 请求类在验证失败时自动返回。 您应该在视图(刀片)文件中显示错误消息。 您可以按照官方文档。
对于 API,它会自动返回包含错误消息的 JSON 响应。
基本上你可以在刀片文件中完成:
@if($errors->has('email'))
<span class="error">{{ $errors->get('email') }}</span>
@endif
只需将
accept: application/json
添加到邮递员或任何用于 API 测试目的的标题中即可。
我认为这是不可能的,但您可以在 FormRequest 中使用prepareForValidation() 方法并在验证之前操作数据。
即使使用表单请求,Laravel 也会自动为您处理验证,而无需您执行任何操作。验证失败时,将返回一个
errors
,您可以在请求响应中访问它。 response.data.errors
(当然,取决于您用于请求的库)将包含错误。例如:
errors: {
name: ["The name must be at least 2 characters"]
}
这只是一个虚拟示例。 通过强制请求失败来进行快速测试,然后控制台记录响应以查看它将如何显示。
将消息功能添加到您的请求验证文件中。在 Laravel 11 上测试。
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
class OrderRequest extends FormRequest
{
public function authorize()
{
//
}
public function rules()
{
return [
'email' => ['required', 'email', 'max:254']
]
}
public function messages()
{
return [
'email.required' => "Please enter email",
];
}
}