Я борюсь с проблемой конфигурации между пакетами Symfony2.
По сути, у меня есть «классическая» структура.
app / config / *. yml содержит различные глобальные конфигурации и маршруты для каждой среды
/ src / Item1 / Bundle1 — Bundle10 — это несколько пакетов, которые определяют основное приложение
/ src / Api / ApiBundle — это пакет, который определяет «api» (набор веб-сервисов, который мне нравится рассматривать как REST)
Проблема:
Bundle1 определяет ExceptionListener для kernel.exception, который совместно используется Bundle1 до 10.
В ApiBundle мне нужно определить другой Listener для того же ядра.exception, чтобы для маршрутов, обрабатываемых ApiBundle, он срабатывал в исключительных случаях.
Как я могу получить это? До сих пор кажется, что последний пакет, загруженный в AppKernel, который определяет прослушиватель, переопределяет прослушиватель и запускается во всех случаях независимо от маршрутов или пакетов.
Есть ли способ «Symfony» сделать это? Мне кажется, что связки должны быть достаточно независимыми.
Спасибо!
Я не знаю, есть ли способ достичь того, чего вы хотите, но в качестве альтернативы вы можете иметь одного слушателя и обрабатывать событие в зависимости от того, из какого пакета оно происходит:
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
}
}
}
Других решений пока нет …