Я пытаюсь вставить контейнер службы 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')
И если вы вообще не используете диспетчер сущностей, то достаточно просто сделать определите свою собственную фабрику соединений с доктриной полностью независимым от пакета доктрины.
Хорошо, глобальное ядро $; $ ядро-> getContainer (); работал у меня. Спасибо за подсказку.
Рад, что у тебя все получилось. Просто имейте в виду, что использование глобальных переменных в Symfony действительно считается очень-очень плохим. В конце концов, было бы лучше научиться делать вещи «правильным» способом.
Я обнаружил, что этот отвечать очень полезен в вашем случае
Если все, что вам нужно, это параметр, почему бы не поместить его как переменную env и вместо этого использовать getenv ()?






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