2015-01-29 3 views
1

Я борюсь с проблемой с конфигурацией между пакетами Symfony2.Конфигурации в Symfony2

В принципе, у меня есть «классическая» структура.

приложение/Config/*. YML имеет различные глобальные конфигурации и за окружающую среду маршрутов

/SRC/Элемент1/Bundle1 к Bundle10 некоторые пучки, которые определяют основное приложение

/SRC/Api/ApiBundle является пучок, который определяет «API» (набор веб-сервисов, которые мне нравится думать как REST) ​​

вопрос:

Bundle1 определяет ExceptionListener для kernel.exception, который распределяется между Bundle1 до 10.

В ApiBundle мне нужно определить другого прослушивателя для того же самого kernel.exception, чтобы для маршрутов, обрабатываемых ApiBundle, он запускается в случаях исключения.

Как это сделать? До сих пор кажется, что последний пакет, загруженный в AppKernel, который определяет Listener, переопределяет слушателя, и он запускается во всех случаях независимо от маршрутов или пакетов.

Есть ли способ «symfony» для этого? Мне кажется, что пучки должны быть достаточно независимыми.

Спасибо!

+0

Взгляните на приоритет слушателя: http://symfony.com/doc/current/cookbook/service_container/event_listener.html. Вам нужно будет установить приоритет в каждом комплекте, чтобы определить, кто идет первым, но это не так уж плохо. – Cerad

ответ

1

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

namespace Your\MainBundle\EventListener; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 

class YourExceptionListener 
{ 
public function onKernelException(GetResponseForExceptionEvent $event) 
{ 
$exception = $event->getException(); 
$namespace = new \ReflectionObject($event->getController())->getNamespaceName(); 

switch ($namespace) 
{ 
    case 'Acme\\DemoBundle': 
    // do whatever with $exception here 
    break; 
    case 'Item1\\Bundle1': 
    // do whatever with $exception here 
    break; 
    case 'Api\\ApiBundle': 
    // do whatever with $exception here 
    break; 
    default; 
    // default 
} 
} 
} 

Кредиты: https://stackoverflow.com/a/11125009/1591238

+0

спасибо, это не совсем то, на что я надеялся, но это будет работать с Bundle, где будут размещаться общие элементы. Благодаря! –

Смежные вопросы