Symfony 2.8: параметры динамических контейнеров на этапе компиляции и используются в security.yml

Я столкнулся с проблемой, которую не могу решить самостоятельно в своем проекте Symfony 2.8 API:

У меня есть некоторые параметры, загруженные при передаче компилятора в DependencyInjection одного из моего пакета:

class ParametersCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
//loads api version from database when container gets built.
$api_version = $container->get('doctrine')->getRepository('MyAppEntityBundle:Parameter')
->findOneBy(['name' => 'api_version']);
if (!$api_version) {
throw new MyAppException('api_version couldnt be found in database during container build process.');
}
$container->setParameter('api_version', $api_version);
}
}

Мне не нужен этот параметр в файлах параметров _ *. Yml, чтобы гарантировать, что он ВСЕГДА извлекается из db +. Я использую его в файле security.yml, например:

security:
firewalls:
api:
pattern:   ^/api/%api_version%/

Как я могу этого достичь?

Очевидно, $ container-> setParameter (‘name’, $ value); не работает, если в файле параметров _ *. yml нет параметра с фиктивным значением в parameters.yml
+ Мне нужно установить эти значения, прежде чем security.yml будет проанализирован и загружен.
Я часами заглядывал в ядро ​​Symfony, где определяется конфигурация безопасности, загруженная из процесса kernel-> boot (), но я не вижу, как добиться того, чего я хочу правильно.

Любая помощь или намеки на правильный метод будет принята с благодарностью 🙂

0

Решение

Это может работать, но я не знаю, является ли это хорошей практикой … SecurityExtension создает динамический сервис для каждого устройства сопоставления запросов брандмауэров, а идентификатор шифруется с помощью md5 и sha1 … вы можете переопределить аргументы.

см. метод createRequestMatcher в Symfony \ Bundle \ SecurityBundle \ DependencyInjection \ SecurityExtension

1

Другие решения

Это явно не очень хорошая практика, поскольку, как я уже говорил в ответ на предыдущие комментарии, я признаю, что это слишком сложная задача для простого управления версиями API. Я заканчиваю настройкой параметра в файле parameters.yml, чтобы при обработке файла security.yml это не было проблемой, и я поместил свою логику управления API в процесс сборки CI. Имеет больше смысла.
@Mocrates Большое спасибо за ваш ответ 🙂

1