Symfony внедряет сервисный контейнер в оболочку подключения к доктрине

Я пытаюсь вставить контейнер службы Symfony в динамическое соединение dcotrine wrapper_class

use Doctrine\DBAL\Connection;    
class DynamicConnection extends Connection
{
    public $container;

    /**
     * @required
     * @param $container
     */
    public function setContainer(ContainerInterface $container)
    {
        $this->container = $container;
    }
}

Я тоже пробовал залить с помощью service.yaml

    App\Service\Database\DynamicConnection:
    calls:
        - [setContainer, ['@service_container']]

Но это тоже не работает. Как я могу вставить сюда сервисный контейнер? Моя цель здесь - получить переменную контейнера службы:

$this->container->get('my.string.variable')

Сама доктрина ничего не знает о контейнере. Doctrine создает соединения с помощью оператора new. Я знаю, что просто негде зацепить контейнер. Вы можете получить доступ к контейнеру глобально ($ kernel-> getContainer ()), хотя это, как правило, не одобряется. Может быть, прослушиватель запросов ядра, который изменяет соединение в начале цикла обработки запроса. Но не вводите весь контейнер, если вам нужен только параметр.

Cerad 10.12.2018 15:20

И если вы вообще не используете диспетчер сущностей, то достаточно просто сделать определите свою собственную фабрику соединений с доктриной полностью независимым от пакета доктрины.

Cerad 10.12.2018 15:28

Хорошо, глобальное ядро ​​$; $ ядро-> getContainer (); работал у меня. Спасибо за подсказку.

dom 10.12.2018 22:43

Рад, что у тебя все получилось. Просто имейте в виду, что использование глобальных переменных в Symfony действительно считается очень-очень плохим. В конце концов, было бы лучше научиться делать вещи «правильным» способом.

Cerad 10.12.2018 22:49

Я обнаружил, что этот отвечать очень полезен в вашем случае

isom 23.09.2019 17:11

Если все, что вам нужно, это параметр, почему бы не поместить его как переменную env и вместо этого использовать getenv ()?

Mouke 30.06.2020 15:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
1 066
1

Ответы 1

Вы можете сделать это, добавив CompilerPass. Для простого CompilerPass вы можете добавить его прямо в класс Kernel вашего приложения, реализовав CompilerPassInterface:

class Kernel extends BaseKernel implements CompilerPassInterface
{
    use MicroKernelTrait;

    ...


    public function process(ContainerBuilder $container)
    {

       $container
          ->getDefinition('doctrine.dbal.default_connection')
          ->addMethodCall('setContainer', [
             new Reference('service_container')
           ]);
    }

}

Однако обратите внимание, что, как упоминали другие пользователи, это не очень хорошая практика. Вы должны вводить именно то, что вам нужно, а не службу контейнера.

Другие вопросы по теме