diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php index 62a60f4d1a9b2..a5647f89060b7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/Descriptor.php @@ -329,8 +329,6 @@ private function getContainerEnvVars(ContainerBuilder $container): array }; $getDefaultParameter = $getDefaultParameter->bindTo($bag, \get_class($bag)); - $getEnvReflection = new \ReflectionMethod($container, 'getEnv'); - $envs = []; foreach ($envVars as $env) { @@ -343,7 +341,7 @@ private function getContainerEnvVars(ContainerBuilder $container): array if (false === ($runtimeValue = $_ENV[$name] ?? $_SERVER[$name] ?? getenv($name))) { $runtimeValue = null; } - $processedValue = ($hasRuntime = null !== $runtimeValue) || $hasDefault ? $getEnvReflection->invoke($container, $env) : null; + $processedValue = ($hasRuntime = null !== $runtimeValue) || $hasDefault ? $container->getEnv($env) : null; $envs["$name$processor"] = [ 'name' => $name, 'processor' => $processor, diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfony/Component/DependencyInjection/Container.php index 04b7022484af5..7bc86d409c8ae 100644 --- a/src/Symfony/Component/DependencyInjection/Container.php +++ b/src/Symfony/Component/DependencyInjection/Container.php @@ -334,7 +334,7 @@ protected function load(string $file) * * @throws EnvNotFoundException When the environment variable is not found and has no default value */ - protected function getEnv(string $name): mixed + public function getEnv(string $name): mixed { if (isset($this->resolving[$envName = "env($name)"])) { throw new ParameterCircularReferenceException(array_keys($this->resolving)); diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 799a2a48117d3..a2916dffbdc3a 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -1549,7 +1549,7 @@ public static function hash(mixed $value): string /** * {@inheritdoc} */ - protected function getEnv(string $name): mixed + public function getEnv(string $name): mixed { $value = parent::getEnv($name); $bag = $this->getParameterBag(); @@ -1612,7 +1612,7 @@ private function getExpressionLanguage(): ExpressionLanguage if (!class_exists(Expression::class)) { throw new LogicException('Expressions cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".'); } - $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders, null, $this->getEnv(...)); + $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders, null); } return $this->expressionLanguage; diff --git a/src/Symfony/Component/DependencyInjection/ContainerInterface.php b/src/Symfony/Component/DependencyInjection/ContainerInterface.php index cad44026c0d8f..9112c995034b7 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerInterface.php +++ b/src/Symfony/Component/DependencyInjection/ContainerInterface.php @@ -19,6 +19,8 @@ /** * ContainerInterface is the interface implemented by service container classes. * + * @method mixed getEnv Fetches a variable from the environment. + * * @author Fabien Potencier * @author Johannes M. Schmitt */ diff --git a/src/Symfony/Component/DependencyInjection/ExpressionLanguage.php b/src/Symfony/Component/DependencyInjection/ExpressionLanguage.php index df47f53a4f625..961c737e8d5c5 100644 --- a/src/Symfony/Component/DependencyInjection/ExpressionLanguage.php +++ b/src/Symfony/Component/DependencyInjection/ExpressionLanguage.php @@ -30,10 +30,10 @@ class ExpressionLanguage extends BaseExpressionLanguage /** * {@inheritdoc} */ - public function __construct(CacheItemPoolInterface $cache = null, array $providers = [], callable $serviceCompiler = null, \Closure $getEnv = null) + public function __construct(CacheItemPoolInterface $cache = null, array $providers = [], callable $serviceCompiler = null) { // prepend the default provider to let users override it easily - array_unshift($providers, new ExpressionLanguageProvider($serviceCompiler, $getEnv)); + array_unshift($providers, new ExpressionLanguageProvider($serviceCompiler)); parent::__construct($cache, $providers); } diff --git a/src/Symfony/Component/DependencyInjection/ExpressionLanguageProvider.php b/src/Symfony/Component/DependencyInjection/ExpressionLanguageProvider.php index f476c5fe6e0d4..a4113057f2bc7 100644 --- a/src/Symfony/Component/DependencyInjection/ExpressionLanguageProvider.php +++ b/src/Symfony/Component/DependencyInjection/ExpressionLanguageProvider.php @@ -28,12 +28,9 @@ class ExpressionLanguageProvider implements ExpressionFunctionProviderInterface { private ?\Closure $serviceCompiler; - private ?\Closure $getEnv; - - public function __construct(callable $serviceCompiler = null, \Closure $getEnv = null) + public function __construct(callable $serviceCompiler = null) { $this->serviceCompiler = null === $serviceCompiler ? null : $serviceCompiler(...); - $this->getEnv = $getEnv; } public function getFunctions(): array @@ -54,11 +51,7 @@ public function getFunctions(): array new ExpressionFunction('env', function ($arg) { return sprintf('$this->getEnv(%s)', $arg); }, function (array $variables, $value) { - if (!$this->getEnv) { - throw new LogicException('You need to pass a getEnv closure to the expression langage provider to use the "env" function.'); - } - - return ($this->getEnv)($value); + return $variables['container']->getEnv($value); }), new ExpressionFunction('arg', function ($arg) {