我想将验证器与控制器分开,但API始终在Postman中以200 OK
进行响应。
请求验证:
class PostRequest extends FormRequest
{
use Types;
public function authorize()
{
return true;
}
public function rules()
{
// $auth = $this->request->user();
return [
'name' => 'required|string|max:255',
'country_id' => 'required|exists:countries,id',
'city' => 'required|max:255',
'phone_no' => 'required|regex:/[0-9]{10,13}/',
'occupation' => 'required|max:255'
];
}
}
SenderController :
public function store(PostRequest $request)
{
$auth = $request->user();
$sender = Sender::create([
'name' => $request->name,
'country_id' => $request->country_id,
'city' => $request->city,
'phone_no' => $request->phone_no,
'occupation' => $request->occupation
]);
return new Resource($sender);
}
当我发送不带name
的请求时,它将返回状态为200的响应。当我忘记输入姓名时,我想在响应中显示$validator->errors()
。我该怎么办?
路由和通话:
Route::post('sender', 'V1\SenderController@store');
POST: localhost:8000/api/v1/sender
答案 0 :(得分:1)
您没有验证数据,只是获取输入指令,它必须通过验证:
public function store(PostRequest $request)
{
$auth = $request->user(); // don't know what this is for? seems unused
$validated = $request->validated(); // returns array of validated data or error
$sender = Sender::create($validated);
return response()->json($sender);
}
Source:如果验证规则通过,您的代码将继续正常执行;但是,如果验证失败,则会引发异常,并且适当的错误响应将自动发送回用户。对于传统的HTTP请求,将生成重定向响应,而将为AJAX请求发送JSON响应。
Source:在AJAX请求期间使用validate方法时,Laravel将不会生成重定向响应。相反,Laravel会生成一个包含所有验证错误的JSON响应。该JSON响应将以422 HTTP状态代码发送。
答案 1 :(得分:1)
您应确保发送的请求带有Accept: application/json
标头。
否则,Laravel不会检测到它是一个API请求,也不会生成带有错误的422响应。
答案 2 :(得分:0)
您的邮递员响应将发回welcome.blade.php
默认视图。这意味着它没有命中您的控制器方法,因为该方法返回Resource
实例。这意味着验证器将不会运行。
检查您要发送请求的路线绝对是正确的路线。另外,请检查您是否在发出POST
请求而不是GET
请求。
答案 3 :(得分:0)
保存之前,您必须先验证您的请求
public function store(PostRequest $request)
{
$auth = $request->validate();
if($auth->fails())
{
return response()->json($auth->errors());
}
$sender = Sender::create([
'name' => $request->name,
'country_id' => $request->country_id,
'city' => $request->city,
'phone_no' => $request->phone_no,
'occupation' => $request->occupation
]);
return new Resource($sender);
}
答案 4 :(得分:0)
我通过在PostRequest.php
中添加更多代码解决了该问题
public $validator = null;
protected function failedValidation($validator)
{
$this->validator = $validator;
}
然后我使用控制器显示错误消息
if (isset($request->validator) && $request->validator->fails()) {
return response()->json([
'error_code'=> 'VALIDATION_ERROR',
'message' => 'The given data was invalid.',
'errors' => $request->validator->errors()
]);
}
答案 5 :(得分:0)
使用注入的FormRequest
对象显示验证错误的正确方法是覆盖failedValidation
。
如之前在注释部分所述,注入的FormRequest
对象本身可以验证请求,而无需在控制器主体中第二次验证请求(这是它的主要优点之一)。如果验证失败,则无论如何您都不会碰到控制器主体。
创建一个扩展FormRequest
并覆盖failedValidation
的抽象类。
<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\Response;
abstract class BaseFormRequest extends FormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
abstract public function rules(): array;
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
abstract public function authorize(): bool;
/**
* Handle a failed validation attempt.
*
* @param Validator $validator
*
* @return void
*/
protected function failedValidation(Validator $validator): void
{
$errors = $validator->errors();
throw new HttpResponseException(response()->json([
'errors' => $errors
], Response::HTTP_UNPROCESSABLE_ENTITY));
}
}
您现在可以在所有API请求验证类上扩展BaseFormRequest
。验证错误现在将显示为带有不可处理实体(422)HTTP代码的JSON编码消息。
来源:https://medium.com/@Sirolad/laravel-5-5-api-form-request-validation-errors-d49a85cd29f2
答案 6 :(得分:0)
如果您要邮递员要求,请务必检查邮件头
Accept = 'application/json'