Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 5.x » Обработка исключений из guzzlehttp » 13.01.2016 22:13:42

MisterN
Ответов: 0

Доброго времени.
На сайте работает guzzle. Вот фрагмент композер.джейсон

 "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.1.*",
       .....
        "guzzlehttp/guzzle": "v6",
	"graze/guzzle-jsonrpc": "~3.0",
       ......
    },

Временами есс-на случаются ошибки, во время которых выпрыгивает страшная страница ошибок. Можно конечно отключить дебагер, но я все-же хочу сделать свою кастомную страницу на ошибки. Вот так я их пытаюсь отловить в app/Exceptions/Handler.php. Я делал по аналогии с 404 страницей - отсеил в render нужную ошибку, подсунул нужную вьюху. Но как раз последнее и не работает.

  public function render($request, Exception $e)
    {

        if($e instanceof \GuzzleHttp\Exception\ConnectException){
            $HandlerContext = $e->getHandlerContext();
            switch ($HandlerContext['errno']) {
                case 28:
                    return response()->view('system.errors.cURL_28_CURLE_OPERATION_TIMEOUT',[],500);
                    break;
                case 7:
                    return response()->view('system.errors.cURL_7_CURLE_COULDNT_CONNECT',[],500);
                    break;
            }

        }
        else
        return parent::render($request, $e);
    }

Собственно, switch благополучно отлавливает ошибки cURL, но вот конструкция return response()->view почему-то не срабатывает. Т.е. если я вставляю

case 28:
echo 'CURLE_OPERATION_TIMEOUT';
return response()->view('system.errors.cURL_28_CURLE_OPERATION_TIMEOUT',[],500);

то echo работает, но я не вижу страницу из  response()->view. Т.е. так: иногда она появляется, но при следующих появлениях сообщений об ошибке ее не видно.  Но казалось бы, я отловил ошибку, начинаю ее обрабатывать, отправляю вид нужный и что не так, почему не вижу своей заветной кастомной страницы?
Если кому-то непонятно, что это за ошибка, поясню.
Эксепшн рОдится в файле vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php на строке 161. От, здесь немного иначе , добавлено настроек, но в целом то же

        $message = sprintf(
            'cURL error %s: %s (%s)',
            $ctx['errno'],
            $ctx['error'],
            'see http://curl.haxx.se/libcurl/c/libcurl-errors.html'
        );

        // Create a connection exception if it was a specific error code.
        $error = isset($connectionErrors[$easy->errno])
            ? new ConnectException($message, $easy->request, null, $ctx)
            : new RequestException($message, $easy->request, $easy->response, null, $ctx);

Собственно, констрактор ConnectException из vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php :

  
 public function __construct(
        $message,
        RequestInterface $request,
        \Exception $previous = null,
        array $handlerContext = []
    ) {
        parent::__construct($message, $request, null, $previous, $handlerContext);
    }

Там в наследуемом RequestException есть функция getHandlerContext, которая собственно, возвращает наш заветный $handlerContext т.е. $ctx из CurlFactory.php, в котором чуть выше набивается данными об ошибке из curl_error и curl_errno. Ну, надеюсь я никого не запутал. Т.о. я надейсь поймать ошибку.

Подвал раздела