Объявить одну и ту же службу в нескольких пакетах


Доброе утро всем. Я разрабатываю приложение, используя именно 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). Это я предполагаю, что это потому, что при повторном объявлении одна и та же служба сталкивается.

Есть ли способ сделать это, применяя передовую практику?

Спасибо за ответы заранее.

Author: Jose FG, 2016-11-24

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

Надеюсь, это поможет ...

 1
Author: Averias, 2016-11-25 18:29:07