diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 24b6920e39a2..ede13acf4731 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1476,9 +1476,13 @@ private function registerSecretsConfiguration(array $config, ContainerBuilder $c } if ($config['decryption_env_var']) { - $container->getDefinition('secrets.decryption_key')->replaceArgument(1, $config['decryption_env_var']); + if (!preg_match('/^(?:\w*+:)*+\w++$/', $config['decryption_env_var'])) { + throw new InvalidArgumentException(sprintf('Invalid value "%s" set as "decryption_env_var": only "word" characters are allowed.', $config['decryption_env_var'])); + } + + $container->getDefinition('secrets.vault')->replaceArgument(1, "%env({$config['decryption_env_var']})%"); } else { - $container->removeDefinition('secrets.decryption_key'); + $container->getDefinition('secrets.vault')->replaceArgument(1, null); } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/secrets.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/secrets.xml index b587e897758e..f70243dd8434 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/secrets.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/secrets.xml @@ -8,25 +8,7 @@ %kernel.project_dir%/config/secrets/%kernel.environment% - - - - - - - - - - - - getEnv - - - - base64:default::SYMFONY_DECRYPTION_SECRET + %env(base64:default::SYMFONY_DECRYPTION_SECRET)% diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache_env_var.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache_env_var.php deleted file mode 100644 index 4f819e7204d7..000000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/cache_env_var.php +++ /dev/null @@ -1,9 +0,0 @@ -setParameter('env(REDIS_URL)', 'redis://paas.com'); - -$container->loadFromExtension('framework', [ - 'cache' => [ - 'default_redis_provider' => '%env(REDIS_URL)%', - ], -]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache_env_var.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache_env_var.xml deleted file mode 100644 index 81c96b3a7ff8..000000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/cache_env_var.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - redis://paas.com - - - - - %env(REDIS_URL)% - - - diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache_env_var.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache_env_var.yml deleted file mode 100644 index 1d9ce5f7f02f..000000000000 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/cache_env_var.yml +++ /dev/null @@ -1,6 +0,0 @@ -parameters: - env(REDIS_URL): redis://paas.com - -framework: - cache: - default_redis_provider: "%env(REDIS_URL)%" diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php index 1e97f61d7cbc..860555cfc730 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php @@ -34,7 +34,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Loader\ClosureLoader; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; +use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpClient\ScopingHttpClient; @@ -1403,20 +1403,6 @@ public function testCacheDefaultRedisProvider() $this->assertSame($redisUrl, $url); } - public function testCacheDefaultRedisProviderWithEnvVar() - { - $container = $this->createContainerFromFile('cache_env_var'); - - $redisUrl = 'redis://paas.com'; - $providerId = '.cache_connection.'.ContainerBuilder::hash($redisUrl); - - $this->assertTrue($container->hasDefinition($providerId)); - - $url = $container->getDefinition($providerId)->getArgument(0); - - $this->assertSame($redisUrl, $url); - } - public function testCachePoolServices() { $container = $this->createContainerFromFile('cache', [], true, false); @@ -1584,7 +1570,7 @@ public function testMailer(): void protected function createContainer(array $data = []) { - return new ContainerBuilder(new ParameterBag(array_merge([ + return new ContainerBuilder(new EnvPlaceholderParameterBag(array_merge([ 'kernel.bundles' => ['FrameworkBundle' => 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'], 'kernel.bundles_metadata' => ['FrameworkBundle' => ['namespace' => 'Symfony\\Bundle\\FrameworkBundle', 'path' => __DIR__.'/../..']], 'kernel.cache_dir' => __DIR__, diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 0b93e05ce06b..b514ce1c8367 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -14,7 +14,6 @@ CHANGELOG * made singly-implemented interfaces detection be scoped by file * added ability to define a static priority method for tagged service * added support for improved syntax to define method calls in Yaml - * added `LazyString` for lazy computation of string values injected into services * made the `%env(base64:...)%` processor able to decode base64url * added ability to choose behavior of decorations on non existent decorated services diff --git a/src/Symfony/Component/DependencyInjection/LazyString.php b/src/Symfony/Component/DependencyInjection/LazyString.php deleted file mode 100644 index 6a03c376b814..000000000000 --- a/src/Symfony/Component/DependencyInjection/LazyString.php +++ /dev/null @@ -1,112 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * A string whose value is computed lazily by a callback. - * - * @author Nicolas Grekas - */ -class LazyString -{ - private $value; - - /** - * @param callable $callback A callable or a [Closure, method] lazy-callable - * - * @return static - */ - public static function fromCallable($callback, ...$arguments): self - { - if (!\is_callable($callback) && !(\is_array($callback) && isset($callback[0]) && $callback[0] instanceof \Closure && 2 >= \count($callback))) { - throw new \TypeError(sprintf('Argument 1 passed to %s() must be a callable or a [Closure, method] lazy-callable, %s given.', __METHOD__, \gettype($callback))); - } - - $lazyString = new static(); - $lazyString->value = static function () use (&$callback, &$arguments, &$value): string { - if (null !== $arguments) { - if (!\is_callable($callback)) { - $callback[0] = $callback[0](); - $callback[1] = $callback[1] ?? '__invoke'; - } - $value = $callback(...$arguments); - $callback = self::getPrettyName($callback); - $arguments = null; - } - - return $value ?? ''; - }; - - return $lazyString; - } - - public function __toString() - { - if (\is_string($this->value)) { - return $this->value; - } - - try { - return $this->value = ($this->value)(); - } catch (\Throwable $e) { - if (\TypeError::class === \get_class($e) && __FILE__ === $e->getFile()) { - $type = explode(', ', $e->getMessage()); - $type = substr(array_pop($type), 0, -\strlen(' returned')); - $r = new \ReflectionFunction($this->value); - $callback = $r->getStaticVariables()['callback']; - - $e = new \TypeError(sprintf('Return value of %s() passed to %s::fromCallable() must be of the type string, %s returned.', $callback, static::class, $type)); - } - - if (\PHP_VERSION_ID < 70400) { - // leverage the ErrorHandler component with graceful fallback when it's not available - return trigger_error($e, E_USER_ERROR); - } - - throw $e; - } - } - - private function __construct() - { - } - - private static function getPrettyName(callable $callback): string - { - if (\is_string($callback)) { - return $callback; - } - - if (\is_array($callback)) { - $class = \is_object($callback[0]) ? \get_class($callback[0]) : $callback[0]; - $method = $callback[1]; - } elseif ($callback instanceof \Closure) { - $r = new \ReflectionFunction($callback); - - if (false !== strpos($r->name, '{closure}') || !$class = $r->getClosureScopeClass()) { - return $r->name; - } - - $class = $class->name; - $method = $r->name; - } else { - $class = \get_class($callback); - $method = '__invoke'; - } - - if (isset($class[15]) && "\0" === $class[15] && 0 === strpos($class, "class@anonymous\x00")) { - $class = get_parent_class($class).'@anonymous'; - } - - return $class.'::'.$method; - } -} diff --git a/src/Symfony/Component/DependencyInjection/Tests/LazyStringTest.php b/src/Symfony/Component/DependencyInjection/Tests/LazyStringTest.php deleted file mode 100644 index 38899bb36972..000000000000 --- a/src/Symfony/Component/DependencyInjection/Tests/LazyStringTest.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Component\DependencyInjection\LazyString; -use Symfony\Component\ErrorHandler\ErrorHandler; - -class LazyStringTest extends TestCase -{ - public function testLazyString() - { - $count = 0; - $s = LazyString::fromCallable(function () use (&$count) { - return ++$count; - }); - - $this->assertSame(0, $count); - $this->assertSame('1', (string) $s); - $this->assertSame(1, $count); - } - - public function testLazyCallable() - { - $count = 0; - $s = LazyString::fromCallable([function () use (&$count) { - return new class($count) { - private $count; - - public function __construct(int &$count) - { - $this->count = &$count; - } - - public function __invoke() - { - return ++$this->count; - } - }; - }]); - - $this->assertSame(0, $count); - $this->assertSame('1', (string) $s); - $this->assertSame(1, $count); - $this->assertSame('1', (string) $s); // ensure the value is memoized - $this->assertSame(1, $count); - } - - /** - * @runInSeparateProcess - */ - public function testReturnTypeError() - { - ErrorHandler::register(); - - $s = LazyString::fromCallable(function () { return []; }); - - $this->expectException(\TypeError::class); - $this->expectExceptionMessage('Return value of '.__NAMESPACE__.'\{closure}() passed to '.LazyString::class.'::fromCallable() must be of the type string, array returned.'); - - (string) $s; - } -} diff --git a/src/Symfony/Component/DependencyInjection/composer.json b/src/Symfony/Component/DependencyInjection/composer.json index 4924d389eeda..5e3f2eab8cee 100644 --- a/src/Symfony/Component/DependencyInjection/composer.json +++ b/src/Symfony/Component/DependencyInjection/composer.json @@ -23,7 +23,6 @@ "require-dev": { "symfony/yaml": "^3.4|^4.0|^5.0", "symfony/config": "^4.3|^5.0", - "symfony/error-handler": "^4.4|^5.0", "symfony/expression-language": "^3.4|^4.0|^5.0" }, "suggest": {