Laravel API не показывает сообщение о проверке запроса

у меня проблемы с обработчиком ошибок в моем бэкэнд 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, но это не проблема, думаю, какое-то перенаправление в обработчике ошибок.

Пока вы используете запросы формы, он не будет возвращать json, использовать фасад валидатора внутри контроллера и отправлять ответ, если валидатор не работает.

ManojKiran Appathurai 03.02.2019 17:15

Может быть, в предыдущей версии (5.6) я мог использовать этот способ и работать, отправляя мне json с разными ошибками? Как я могу вместо этого использовать фасад проверки?

Agustin 03.02.2019 17:50

Спасибо за руководство. Я решаю добавить защищенную функцию failedValidation(Validator $validator) { throw new HttpResponseException(response()->json($validator->errors(), 422)); }

Agustin 03.02.2019 18:14

Я думаю, что правильный подход — добавить обработчик исключений: laravel.com/docs/8.x/errors

Stefan 16.09.2020 16:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
4
4
7 255
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Просто добавьте этот код в 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, вы спасли мой день, спасибо!

Amitesh Bharti 25.07.2020 22:18

Просто добавьте этот код в 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));
}

Другие вопросы по теме