Symfony2: Исключение циклической ссылки — монолог и пользовательский обработчик исключений

При попытке объединить ошибки электронной почты Monolog с настраиваемым обработчиком исключений я получаю следующее:

[Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException] Обнаружена циклическая ссылка для службы "router", путь: "router -> monolog.logger.router -> monolog.handler.grouped -> mana.exception.listener -> templating -> ветка -> templating.helper.logout_url".

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

Выдержка из услуг:

  mana.exception.listener:
    class:  Mana\ClientBundle\EventListener\ExceptionListener
    arguments: [@templating, @kernel]
    tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

Выдержка из конфига:

monolog:
    handlers:
        main:
            type:  stream
            path:  %kernel.logs_dir%/%kernel.environment%.log
            level: debug
            handler: grouped
        grouped:
            type: group
            members: [mail, custom]
        mail:
            type:         fingers_crossed
            action_level: error
            handler:      buffered
        buffered:
            type:    buffer
            handler: swift
        swift:
            type:       swift_mailer
            from_email: [email protected]
            to_email:   [email protected]
            subject:    An Error Occurred!
            level:      debug
        custom:
            type: service
            id: mana.exception.listener

Пользовательский обработчик:

class ExceptionListener {

    protected $templating;
    protected $kernel;

    public function __construct(EngineInterface $templating, $kernel) {
        $this->templating = $templating;
        $this->kernel = $kernel;
    }

    public function onKernelException(GetResponseForExceptionEvent $event) {
        // provide the better way to display a enhanced error page only in prod environment, if you want
        if ('prod' == $this->kernel->getEnvironment()) {
            // exception object
            $exception = $event->getException();

            // new Response object
            $response = new Response();

            // set response content
            $response->setContent(
                    // create you custom template AcmeFooBundle:Exception:exception.html.twig
                    $this->templating->render(
                            'ManaClientBundle:Exception:exception.html.twig', array('exception' => $exception)
                    )
            );

            // HttpExceptionInterface is a special type of exception
            // that holds status code and header details
            if ($exception instanceof HttpExceptionInterface) {
                $response->setStatusCode($exception->getStatusCode());
                $response->headers->replace($exception->getHeaders());
            } else {
                $response->setStatusCode(500);
            }

            // set the new $response object to the $event
            $event->setResponse($response);
        }
    }

person geoB    schedule 17.11.2013    source источник


Ответы (2)


Это ваш прослушиватель исключений. Удалите @kernel из массива аргументов, и все в порядке.

mana.exception.listener:
    class:  Mana\ClientBundle\EventListener\ExceptionListener
    arguments: [@templating]
    tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
person Pi Wi    schedule 17.11.2013
comment
Боюсь, что это не так. Исключение @kernel из не устранило ошибку циклической ссылки. - person geoB; 18.11.2013
comment
Это также может быть вашим шаблоном, но я так не думаю. Вы читали symfony.com/doc/current/cookbook/service_container/ ? - person Pi Wi; 18.11.2013

Ваш пользовательский прослушиватель исключений, вероятно, зависит от monolog либо в службе шаблонов, либо в службе ядра.

person Leevi Graham    schedule 22.02.2014