Внедрение зависимостей: как перезаписать службу пакета Framework?

#symfony #symfony4

#symfony #symfony4

Вопрос:

При использовании пакета фреймворка Symfony 4.2 с компонентом Serializer существует несколько нормализаторов, автоматически настраиваемых Фреймворком в определенном порядке.

Я хочу заменить один из этих нормализаторов (ObjectNormalizer) моей личной реализацией (которая является расширением ObjectNormalizer), не затрагивая все другие предоставленные нормализаторы или их порядок.

Есть ли способ добиться этого без повторного объявления всех нормализаторов и их порядка в конфигурации сериализатора?

Другим вариантом было бы убедиться, что мой пользовательский нормализатор расположен непосредственно перед ObjectNormalizer.

Комментарии:

1. вы рассматривали возможность добавления прохода компилятора для переопределения компонента, symfony.com/doc/current/service_container/compiler_passes.html ? Я не знаком с 4 и компонентом сериализатора, но если вы можете получить доступ к нормализатору по имени, вы должны быть в состоянии переопределить его.

2. Спасибо, насколько я понимаю, это просто добавление нормализаторов к индексированному массиву, нет имени, чтобы напрямую идентифицировать его. Вот почему я спрашиваю, есть ли способ получше.

Ответ №1:

Приоритет нормализаторов определяется конфигурацией пакета фреймворка Symfony. С приоритетами, перечисленными здесь, можно ознакомиться

Зная это, можно определить собственный приоритет для размещения CustomNormalizer там, где требуется в service.yaml :

 AppNormalizerMyCustomNormalizer:
    tags:
    - {name: serializer.normalizer, priority: -995}