у меня проблемы с обработчиком ошибок в моем бэкэнд laravel API, не показывать сообщение об ошибке при проверке.
маршруты / API
<?php
Route::group([
'middleware' => 'api',
], function ($router) {
Route::post('access/sign-up', 'AuthenticationController@signUp');
});
Контроллер аутентификации
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\SignUpRequest;
use Illuminate\Http\Request;
use App\User;
class AuthenticationController extends Controller
{
/**
* Create a new AuthenticationController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['signUp']]);
}
/**
*
*
* @return \Illuminate\Http\JsonResponse
*/
public function signUp(SignUpRequest $request)
{
//User::create($request->all());
return response()->json([
'data' => 'Usuario creado correctamente.'
]);
}
}
Запрос на регистрацию
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SignUpRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => 'required|email|unique:users',
'firstName' => 'required',
'password' => 'required',
];
}
}
Дело в том, что когда почтальон отправляет пароль пустым или не отправляет почту, например, он отправляет меня на главную страницу вместо отправки мне json со всеми ошибками, как и раньше. Я не знаю, что делать. Я пробовал с пользовательским сообщением в SignUpRequest, но это не проблема, думаю, какое-то перенаправление в обработчике ошибок.
Может быть, в предыдущей версии (5.6) я мог использовать этот способ и работать, отправляя мне json с разными ошибками? Как я могу вместо этого использовать фасад проверки?
Спасибо за руководство. Я решаю добавить защищенную функцию failedValidation(Validator $validator) { throw new HttpResponseException(response()->json($validator->errors(), 422)); }
Я думаю, что правильный подход — добавить обработчик исключений: laravel.com/docs/8.x/errors






Просто добавьте этот код в SignUpRequest
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
С помощью формы запроса; Если проверка не пройдена, будет сгенерирован ответ перенаправления, чтобы отправить пользователя обратно в его предыдущее местоположение. Вот почему вы перенаправляете обратно на страницу вместо ответа JSON.
У Laravel есть один защищенный метод «failedValidation». Перезапишите этот метод в классе запроса формы.
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
throw new \Illuminate\Validation\ValidationException(response()->json($validator->errors(), 422));
}
Я не нашел этого даже в официальном документе Laravel, вы спасли мой день, спасибо!
Просто добавьте этот код в App\Exceptions\Handler:
public function render($request, Exception $exception)
{
if ($exception instanceof ValidationException) {
return response()->json([
'status' => false,
'error' => [
'type' => 'form',
'code' => 400,
'description' => 'Bad request.',
'detail' => $exception->validator->errors()
]
], 422);
}
return parent::render($request, $exception);
}
Просто в вашем App\Exceptions\Handler вы должны зарегистрировать свою собственную обработку исключений в методе register():
public function register() {
$this->renderable( function ( ValidationException $ex, $request ) {
$response = [
'ErrorCode' => 'my_error_code',
'ErrorMessage' => $ex->validator->errors()
];
return response()->json( $response );
} );
}
TL;DR Добавьте следующий заголовок: Accept: application/json
Как упоминалось здесь несколькими пользователями, по умолчанию при сбое запроса формы приложение попытается перенаправить пользователя обратно в его предыдущее местоположение. Вот почему вы получаете веб-страницу вместо ответа JSON.
Мы также можем переопределить метод «failedValidation». Но я бы рекомендовал установить следующий заголовок на запрос Accept: application/json.
Laravel вернет соответствующий ответ на основе заголовка Accept. Для application/json Laravel вернет ответ JSON с ошибками формы.
Вам нужно проверить только один параметр, который должен добавить Accept Type в данные заголовка в Postman.
Принять: приложение/json
это работа в моем случае...
Обновление для laravel 8, первый параметр в ValidationException — это класс Validator:
protected function failedValidation(Validator $validator)
{
throw new ValidationException($validator, response()->json($validator->errors(), 422));
}
Пока вы используете запросы формы, он не будет возвращать json, использовать фасад валидатора внутри контроллера и отправлять ответ, если валидатор не работает.