Laravel - поймать исключение в пользовательском обработчике - PullRequest
0 голосов
/ 26 мая 2018

Я использую 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. app \ Exceptions \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. app \ Exceptions \ 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"]
            );
        }
    }
    

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

Ошибка типа: Аргумент 2 передан в App \ Exceptions \ HttpExceptions \ UnprocessableEntityException :: render () должен быть экземпляром GuzzleHttp \ Exception \ ClientException, ничего не дано, вызывается в ... \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Exceptions \ Handler.php в строке 169

1 Ответ

0 голосов
/ 26 мая 2018

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

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"]
        );
    }
}
...