#symfony #autowired
#symfony #автоматическое подключение
Вопрос:
В Symfony 4 и 5 у нас есть концепция пулов кэша. Когда мы определяем новый пул кэша, для него создается новая служба, используя имя пула. Проблема в том, что, поскольку все они используют один и тот же интерфейс CacheInterface, Symfony не будет знать, какую службу вводить, если мы полагаемся исключительно на интерфейс.
Мой вопрос заключается в том, как использовать autowire в приведенном выше случае, чтобы автоматически подключить определенную службу пула кэша к другой службе.
(Я мог бы ввести пул кэша вручную, но если я могу, то я не хочу).
Комментарии:
1. Представьте, что вы являетесь кодом autowire. Когда вы сталкиваетесь с несколькими реализациями одного и того же интерфейса кэша, какие критерии вы бы использовали для автоматического выбора одного? Если вы действительно можете сформулировать критерии, то возможно, что проход компилятора может сработать.
2. Привет, Cerad, да, я знаю, какой именно я хочу использовать. Я нашел эту ссылку: symfony.com/doc/current/service_container/autowiring.html . Похоже, я могу использовать имя переменной, чтобы предложить, поэтому мне нужно определить «псевдоним», такой как App Util TransformerInterface $ shoutyTransformer: ‘@App Util UppercaseTransformer’. Я проверю, нужно ли мне это делать самому или Symfony уже это сделала (скорее всего, нет)
3. Оки, вы знаете, что псевдонимы фактически генерируются автоматически (что можно проверить, выполнив команду debug:autowired). Я чувствую, что это должно быть упомянуто где-нибудь в их документах. Иногда мне кажется, что Symfony движется слишком быстро, у них нет времени на создание надлежащих документов, и нам приходится много копаться в коде.
Ответ №1:
Я чувствую себя плохо, отвечая на свой собственный вопрос, я надеюсь, что кто-то еще выиграет от этого:
Когда вы определяете свои пулы, Symfony автоматически создаст для вас псевдонимы для автоматического подключения, так что вы можете использовать что-то вроде этого:
Symfony Contracts Cache CacheInterface $yourPoolName и Symfony будут знать, какой пул использовать. Обратите внимание, что имя параметра будет версией реального имени вашего пула в формате camelCase.
Вы можете проверить, выполнив команду debug:autowired, чтобы просмотреть этот список.
Комментарии:
1. Я впервые увидел, что вы можете использовать имя аргумента как часть псевдонима. Не очень удобно сопоставлять имена аргументов службам, но приятно знать, что это можно сделать. Я бы предположил, что новая возможность атрибута в конечном итоге позволит что-то вроде #[CachePool=name] непосредственно в конструкторе.
2. @Cerad Я согласен с вами, честно говоря, мне это не очень нравится. Я думаю, что в будущем они должны решить это с помощью атрибутов.
3. Symfony имеет возможность «привязывать» имена аргументов к службам, например, при работе с интерфейсами с несколькими реализациями. Эта настройка может быть выполнена для любых служб в вашем services.yml