Вы пытаетесь полагаться на способность определения сервисов Symfony использовать выражения для определения определенных аспектов сервисов. Однако вы должны помнить, что эта функциональность является частью Dependency Injection компонента, который может (но не ограничивается) использовать файлы конфигурации для сервисов. Чтобы быть более точным - эта функциональность предоставляется загрузчиками конфигурации, вы можете посмотреть здесь , например, как она обрабатывается загрузчиком конфигурации Yaml.
С другой стороны, конфигурация для комплекта Doctrine, которую вы пытаетесь использовать, обеспечивается компонентом Config . Тот факт, что компонент Dependency Injection использует те же форматы файлов, что и компонент Config, может создать впечатление, что эти случаи обрабатываются одинаково, но на самом деле они совершенно разные.
Подводя итог: выражение внутри конфигурации Doctrine не работает так, как вы ожидаете, потому что процессор конфигурации пакета Doctrine не ожидает получения выражения языка выражений и не поддерживает их обработку.
Хотя приведенные выше объяснения, надеюсь, отвечают на ваш вопрос - вы, вероятно, ожидаете получить некоторую информацию о том, как на самом деле решить вашу проблему.
Существует как минимум 2 возможных способа сделать это, но выбор правильного способа может потребовать дополнительной информации, которая выходит за рамки этого вопроса.
В случае, если вы знаете, какое соединение выбрать во время создания контейнера (ваш код предполагает, что это так, но вы можете не знать об этом) - тогда вы следует использовать механизм pass компилятора для обновления определений сервисов Doctrine DBAL (что может быть довольно сложно). Причиной этого нетривиального процесса является то, что конфигурации загружаются на ранних этапах процесса построения контейнера и не предоставляют точек расширения. При необходимости вы можете просмотреть источников . В любом случае, хотя это возможно, я бы не рекомендовал вам идти по этому пути, и, скорее всего, он вам не понадобится, потому что (я полагаю) вам нужно выбирать соединение во время выполнения, а не во время создания контейнера.
Вероятно, более правильным подходом является создание собственной оболочки класса DBAL Connection
, которая будет поддерживать список фактических соединений и обеспечит требуемое соединение в зависимости от логики вашего приложения. Вы можете обратиться к деталям реализации функции DBAL sharding в качестве примера. Класс Wrapper может быть определен напрямую через конфигурацию пакета Doctrine с помощью ключа wrapper_class
для конфигурации dbal