Laravel - Поймать исключение в пользовательском обработчике

Я использую Laravel 5.5 и хочу обрабатывать свои пользовательские исключения из пользовательских обработчиков, а не из app\Exceptions\Handler.php. Теперь я перехватываю исключение, если какое-то поле в форме, отправленной пользователем, пусто. Он отлично работает вот так:

  1. ProfileController.php:

    public function update(Request $request, $id){
        $this->guzzleService->put(
            $request,
            ApiEndPoints::UPDATE_PROFILE . $id,
            true
        );
    
        return back()->with('SavedCorrectly', 'Changes saved correctly');
    }
    
  2. приложение \ Исключения \ Handler.php

    public function render($request, Exception $exception)
    {
        if ($exception instanceof ClientException && $exception->getCode() == 422)
            return back()->withErrors(
                json_decode((string) $exception->getResponse()->getBody(), TRUE)["errors"]
            );
    
        return parent::render($request, $exception);
    }
    

Проблема в том, что я хочу его реорганизовать, чтобы он оставался таким:

  1. ProfileController.php

    public function update(Request $request, $id){
        try {
            $this->guzzleService->put(
                $request,
                ApiEndPoints::UPDATE_PROFILE . $id,
                true
            );
    
            return back()->with('SavedCorrectly', 'Cambios guardados correctamente');
        } catch(ClientException $exception) {
            if ($exception->getCode() == 500) throw new InternalServerErrorException;
            if ($exception->getCode() == 422) throw new UnprocessableEntityException;
        }
    }
    
  2. приложение \ Исключения \ HttpExceptions \ UnprocessableEntityException.php

    <?php
    
    namespace App\Exceptions\HttpExceptions;
    
    use GuzzleHttp\Exception\ClientException;
    
    class UnprocessableEntityException extends \Exception
    {
        public function render($request, ClientException $exception)
        {
            return back()->withErrors(
                json_decode((string) $exception->getResponse()->getBody(), TRUE)["errors"]
            );
        }
    }
    

Но я получаю эту ошибку:

Type error: Argument 2 passed to App\Exceptions\HttpExceptions\UnprocessableEntityException::render() must be an instance of GuzzleHttp\Exception\ClientException, none given, called in ... \vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php on line 169

Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
1 777
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

это потому, что вы передаете новое исключение

public function update(Request $request, $id){
    try {
        $this->guzzleService->put(
            $request,
            ApiEndPoints::UPDATE_PROFILE . $id,
            true
        );

        return back()->with('SavedCorrectly', 'Cambios guardados correctamente');
    } catch(ClientException $exception) {
        if ($exception->getCode() == 500) throw new InternalServerErrorException((string) $exception->getResponse()->getBody());
        if ($exception->getCode() == 422) throw new UnprocessableEntityException((string) $exception->getResponse()->getBody());
    }
}

а также

<?php

namespace App\Exceptions\HttpExceptions;

use GuzzleHttp\Exception\ClientException;

class UnprocessableEntityException extends \Exception
{
    public function render($request)
    {
        return back()->withErrors(
            json_decode((string) $this->message, TRUE)["errors"]
        );
    }
}

Спасибо. Это сработало. Я подозревал причину, но не знал, как это сделать.

Sergio 27.05.2018 19:43

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

Как избежать копирования кода для обработки исключений, неопределенных переменных и некоторых сравнений таким же образом
Исключение Android RoomDatabase во время вставки данных во второй раз
Исключение подключения Cassandra для крупных транзакций
Python: запустить инструкцию, которая не имеет никакого эффекта, только для того, чтобы проверить, возникает ли исключение?
Я получаю следующее, когда пытаюсь установить соединение с MySQL. java.math.BigInteger не может быть преобразован в java.lang.Long
Selenium Automation - Cucumber и JUnit - Нет метода общедоступных статических параметров
Исключение при попытке получить параметр из URL
Как поймать исключение и исправить код, а затем снова запустить функцию?
Cpp исключение получить подробную информацию о вызывающем броске
Какое исключение должно быть выброшено из транзакционного метода в соответствии со стандартом JTA?