Пользовательский валидатор Laravel 6 всегда возвращает JSON

Я всегда использовал в своих формах Ajax для выполнения CRUD, но теперь мне нужно было создать форму, которая регулярно публикуется без Ajax.

Пару часов меня поражает то, что обычай PostsRequest::classвсе же работает хорошо, и вот моя проблема, когда проверка не выполняется, она повторяет сообщение JSON. Мне нужно фиксировать ошибки старомодным способом, например:

 @error('title')
    <div class="alert alert-danger">{{ $message }}</div>
 @enderror

но я получаю, что браузер отображает:

{
 "message": "Please correct the errors.",
  "errors": {
      "title": [
          "The title must be between 15 and 16 characters."
      ]
   }
}

Метод store() в моем контроллере:

/**
 * Store a newly created resource in storage.
 *
 * @param \App\Http\Requests\Frontend\ReviewsRequest $request
 * @param \App\Models\Review                         $review
 *
 * @return \Illuminate\Http\Response
 * @since 2.2.0
 */
public function store(ReviewsRequest $request, Review $review)
{

    try {
        \DB::beginTransaction();

        $data                     = $request->all();
        $data['active']           = 0;
        $data['approved']         = 0;

        $review = $review->create($data);

        // sync user reviews
        $review->users()->sync(auth()->id(), $review->id);

        // sync internal reviews
        if($request->get('type') == 'internals') {
            $review->internals()->sync(1, $review->id);
        }

        // sync internal reviews
        if($request->get('type') == 'firm') {
            $review->firms()->sync(120, $review->id);
        }

        \DB::commit();

        return view('frontend.reviews.review_thank_you');

    } catch(Exception $e) {
        echo $e->getMessage();
    } finally {
    }
}

Я искал почти везде, документацию, здесь, в Stackru, в Интернете и т. Д., И все, что я нашел, - это люди, желающие получить ответ JSON.

В моем PostsRequest класс, я, как обычно, установил public function rules(){ ... } и public function messages( ... )

Что я делаю не так? Спасибо за любую помощь с этим довольно глупым вопросом.

1 ответ

Решение

Хорошо,

РЕШЕНО.

После нескольких часов копания в коде и отслеживания каждого шага процесса проверки я наконец нашел причину такого поведения.

В моем классе App\Exceptions\Handler в render() имеет следующее переопределение:

/**
* Render an exception into an HTTP response.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Exception  $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Exception
*/
public function render($request, Exception $exception)
{
    // THIS IS WHERE THE 'BLACK MAGIC' WAS HAPPENING <----
    if ($exception instanceof ValidationException){
        return response()->json([
            'message' =>'Please correct the errors.', 
            'errors'  => $exception->validator->getMessageBag()], 422);
    }

    return parent::render($request, $exception);
}

Иногда нам нужно сделать перерыв в 20-часовом рабочем графике, чтобы освежить и перезагрузить мозг...

Спасибо всем, кто попытался разобраться в этом вопросе. Если кто-то столкнется с подобной проблемой, изучите логику своих методов App\Exceptions\Handler::class.

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