Объявить одну и ту же службу в нескольких пакетах
Доброе утро всем. Я разрабатываю приложение, используя именно Symfony 2.8, и у меня есть сомнения относительно того, как я могу организовать объявления моих служб нормализации сущностей. Я делаю это таким образом, чтобы я мог удобно и правильно парсировать в JSON объекты, которые я храню в своем BD, я вставляю вам код, чтобы немного прояснить, что тема идет:
namespace XXX\XXXBundle\Normalizer;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\Normalizer\SerializerAwareNormalizer;
use ...
class ReservaNormalizer extends SerializerAwareNormalizer implements NormalizerInterface {
public function normalize($object, $format = null, array $context = array()) {
return [
'reserva_id' => $object->getId(),
'reserva_nombre' => $object->getNombre(),
...
];
}
public function supportsNormalization($data, $format = null) {
return $data instanceof Reserva;
}
}
после этого я устанавливаю файл services.yml (основной, файл app / config) следующим образом:
services:
...
# JSON Encoder
default.encoder.json:
class: 'Symfony\Component\Serializer\Encoder\JsonEncoder'
# Serializer
symfony.serializer:
class: 'Symfony\Component\Serializer\Serializer'
arguments:
0:
- '@xxx.normalizer.xxx'
- '@otro.normalizer.mas'
- '...otro...'
- '@serializer.normalizer.object'
1:
- '@default.encoder.json'
и в т.yml каждого bundle:
services:
# XXX Normalizer
xxx.normalizer.xxx:
class: 'XXX\XXXBundle\Normalizer\XXXNormalizer'
я хочу не объявлять все настройки Normalizer в arguments 0 основного файла конфигурации службы, чтобы, таким образом, иметь все более аккуратное, а не весь список вместе.
если я повторю
symfony.serializer:
class: 'Symfony\Component\Serializer\Serializer'
в каждом файле services.yml каждого bundle дает мне исключение для круговой reference been detected (configured limit: 1). Это я предполагаю, что это потому, что при повторном объявлении одна и та же служба сталкивается.
Есть ли способ сделать это, применяя передовую практику?
Спасибо за ответы заранее.
1 answers
Я не знаю, нужен ли вашему symfony.serializer
все Normalizers или только один при каждом вызове, я предполагаю, что только один, для этого вы можете использовать CompilerPass
который позволяет вам изменять начальную конфигурацию службы (или чего-либо загруженного в container) даже динамически.
Вы можете либо определить список normalizers, которые вам нужны, если вам нужны все, либо динамически загрузить только тот, который вам нужен, если вам нужен только один.
Шаги:
1) определить класс, который удлините от CompilerPassInterface
2) Добавьте этот класс В класс вашего Bundle
Например, чтобы определить compilerPass:
class ServiceCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->getDefinition('symfony.serializer')
->setArguments([
new Reference($container->getParameter('normalizer1')),
new Reference($container->getParameter('normalizer2'))
...
]);
}
}
И включить в calse вашего bundle
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new ServiceCompilerPass());
}
, вы Можете найти хорошую статью здесь: http://richardmiller.co.uk/2012/02/22/symfony2-manipulating-service-parameters-and-definitions/
И отсюда вы можете получить что-то еще: http://symfony.com/doc/current/components/dependency_injection/compilation.html#components-di-compiler-pass
Надеюсь, это поможет ...