Я пытаюсь расширить встроенный обработчик ошибок 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 - это все о командах, контроллеры не должны быть его частью и не могут быть, потому что нет запроса / ответа, но вместо этого у вас есть stdin и stdout.
Если вы хотите иметь обработчик исключений для команд, вам следует использовать ConsoleEvents :: ERROR. Но это не должно быть стандартным потоком приложения, лучше использовать try, catch, наконец, действительно поймать исключения и соответствующим образом отреагировать.
зачем вам вообще пытаться рендерить twig it CLI? CLI - это все о командах, контроллеры не должны быть его частью.