Я столкнулся с проблемой, которую не могу решить самостоятельно в своем проекте 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 (), но я не вижу, как добиться того, чего я хочу правильно.
Любая помощь или намеки на правильный метод будет принята с благодарностью 🙂
Это может работать, но я не знаю, является ли это хорошей практикой … SecurityExtension создает динамический сервис для каждого устройства сопоставления запросов брандмауэров, а идентификатор шифруется с помощью md5 и sha1 … вы можете переопределить аргументы.
см. метод createRequestMatcher в Symfony \ Bundle \ SecurityBundle \ DependencyInjection \ SecurityExtension
Это явно не очень хорошая практика, поскольку, как я уже говорил в ответ на предыдущие комментарии, я признаю, что это слишком сложная задача для простого управления версиями API. Я заканчиваю настройкой параметра в файле parameters.yml, чтобы при обработке файла security.yml это не было проблемой, и я поместил свою логику управления API в процесс сборки CI. Имеет больше смысла.
@Mocrates Большое спасибо за ваш ответ 🙂