Skip to content

Commit ea7ea89

Browse files
fix: resolve %kernel.default_locale% parameter reference before validation
processConfiguration() does not resolve Symfony %param% references, so the default_locale validation always failed when left at its default. Resolve via ParameterBag::resolveValue() and store the resolved value into container parameters. When the resolved value contains environment variable placeholders (%env(...)%), skip compile-time validation since the actual value is only known at runtime. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6afb157 commit ea7ea89

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

src/DependencyInjection/TmiTranslationExtension.php

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,21 @@ public function load(array $configs, ContainerBuilder $container): void
5050

5151
// Resolve default_locale — processConfiguration() does not resolve %param% references
5252
/** @var string $defaultLocale */
53-
$defaultLocale = $container->getParameterBag()->resolveValue($config['default_locale']);
54-
$config['default_locale'] = $defaultLocale;
53+
$defaultLocale = $container->getParameterBag()->resolveValue($config['default_locale']);
5554

56-
// Validate that default_locale is included in enabled_locales
57-
if (!\in_array($defaultLocale, $enabledLocales, true)) {
58-
throw new \LogicException(\sprintf('The default_locale "%s" must be included in framework.enabled_locales [%s].', $defaultLocale, implode(', ', $enabledLocales)));
55+
// Detect whether the resolved value contains environment variable placeholders
56+
$usedEnvs = [];
57+
$container->resolveEnvPlaceholders($defaultLocale, null, $usedEnvs);
58+
59+
if ([] === $usedEnvs) {
60+
// Static value — validate and store resolved locale
61+
$config['default_locale'] = $defaultLocale;
62+
63+
if (!\in_array($defaultLocale, $enabledLocales, true)) {
64+
throw new \LogicException(\sprintf('The default_locale "%s" must be included in framework.enabled_locales [%s].', $defaultLocale, implode(', ', $enabledLocales)));
65+
}
5966
}
67+
// When env vars are used, skip validation — the actual value is resolved at runtime
6068

6169
// Set configuration into params
6270
$rootName = 'tmi_translation';

tests/DependencyInjection/TmiTranslationExtensionTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,25 @@ public function testDefaultLocaleParameterReferenceIsResolved(): void
335335
self::assertSame('en_US', $containerBuilder->getParameter('tmi_translation.default_locale'));
336336
}
337337

338+
/**
339+
* @throws Exception
340+
* @throws TypesException
341+
*/
342+
public function testDefaultLocaleEnvVarSkipsValidation(): void
343+
{
344+
$containerBuilder = new ContainerBuilder();
345+
$containerBuilder->setParameter('kernel.enabled_locales', ['en_US', 'de_DE', 'it_IT']);
346+
$containerBuilder->setParameter('kernel.default_locale', '%env(DEFAULT_LOCALE)%');
347+
348+
$extension = new TmiTranslationExtension();
349+
350+
// Should not throw — env vars cannot be validated at compile time
351+
$extension->load([[]], $containerBuilder);
352+
353+
// The raw parameter reference is kept so Symfony resolves it at runtime
354+
self::assertSame('%kernel.default_locale%', $containerBuilder->getParameter('tmi_translation.default_locale'));
355+
}
356+
338357
private function createContainerBuilderFromKernel(): ContainerBuilder
339358
{
340359
$containerBuilder = new ContainerBuilder();

0 commit comments

Comments
 (0)