Как расширить обработку ошибок Symfony 3?

Я пытаюсь расширить встроенный обработчик ошибок Symfony 3.3, чтобы переопределить то, что он делает в интерфейсе командной строки, но оставить существующее поведение на месте для веб-запросов.

Всякий раз, когда у меня появляется ошибка в моих модульных тестах в Symfony, он выдает 3000 строк HTML в CLI. Это просто глупо.

Итак, я попытался следовать документация для расширения встроенной обработки ошибок.

я добавил

services:
    _defaults:
        autowire: true

   twig.exception_listener:
       class:  AppBundle\Controller\MyExceptionController
       public: true
       arguments: "%kernel.debug%"

Как это показано в документации, и Symfony жалуется:

Type error: Argument 1 passed to Symfony\Component\DependencyInjection\Definition::setArguments() must be of the type array, string given, called in /Projects/rest_api/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php on line 425

Итак, на другой странице переполнения стека я обнаружил, что вам также нужно пройти в Twig.

Теперь у меня это есть в services.yml

   twig.exception_listener:
       class:  AppBundle\Controller\MyExceptionController
       public: true
       arguments: ["@twig", "%kernel.debug%"]

Все идет нормально. Вот MyExceptionController:

<?php
// AppBundle/Controllers/MyExceptionController.php

namespace AppBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class MyExceptionController extends ExceptionController
{
    /**
     * Converts an Exception to a Response.
     *
     * A "showException" request parameter can be used to force display of an error page (when set to false) or
     * the exception page (when true). If it is not present, the "debug" value passed into the constructor will
     * be used.
     *
     * @param Request $request
     * @param FlattenException $exception
     * @param DebugLoggerInterface|null $logger
     * @return Response
     */
    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
    {
        if (php_sapi_name() === 'cli') {
            $error = <<<EOF
-------------------------------------------------------
--    ______ _____  _____   ____  _____  _ 
--   |  ____|  __ \|  __ \ / __ \|  __ \| |
--   | |__  | |__) | |__) | |  | | |__) | |
--   |  __| |  _  /|  _  /| |  | |  _  /| |
--   | |____| | \ \| | \ \| |__| | | \ \|_|
--   |______|_|  \_\_|  \_\\____/|_|  \_(_)
--                                         
--------------------------------------------------------
EOF;

            $error .= "\n".print_r($exception, true)."\n";
            return $error;
        } else {
            return parent::showAction($request, $exception, $logger);
        }
    }

}

Вот что странно. Я получаю страницу ошибки HTML по умолчанию в браузере, и HTML ушел из интерфейса командной строки, но я не вижу, чтобы мой код вызывается. Даже если я помещу die('Got Here') в начало моего метода showAction (), он никогда не будет вызван.

Я вернулся и перечитал документы несколько раз. Я пробовал это:

# app/config/config.yml
twig:
    exception_controller: AppBundle:MyExceptionController:showAction

Еще ничего. Похоже, это вообще не имело никакого эффекта.

Так что здесь происходит не так?

зачем вам вообще пытаться рендерить twig it CLI? CLI - это все о командах, контроллеры не должны быть его частью.

Robert 23.03.2018 21:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
328
1

Ответы 1

Зачем вам вообще пытаться рендерить twig it CLI? CLI - это все о командах, контроллеры не должны быть его частью и не могут быть, потому что нет запроса / ответа, но вместо этого у вас есть stdin и stdout.

Если вы хотите иметь обработчик исключений для команд, вам следует использовать ConsoleEvents :: ERROR. Но это не должно быть стандартным потоком приложения, лучше использовать try, catch, наконец, действительно поймать исключения и соответствующим образом отреагировать.

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