Symfony 2.8:编译器传递动态容器参数并在 security.yml 中使用

Symfony 2.8 : dynamic containers parameters at compiler pass and used in 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);
    }
}

我不想在 paramters_*.yml 文件中使用此参数,以确保始终从 db 检索它 + 我在 security.yml 文件中使用它,例如:

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

我怎样才能做到这一点?

显然,$container->setParameter('name', $value);如果 parameter_*.yml 文件中的参数在 parameters.yml 中没有虚拟值,则不起作用 + 我需要在解析和加载 security.yml 之前设置这些值。 我研究了 symfony 核心几个小时,发现了从 kernel->boot() 进程加载安全配置的位置,但我不知道如何正确实现我想要的。

任何有关正确方法的帮助或提示将不胜感激:)

它可以工作,但我不知道这是否是一个好的做法...SecurityExtension 为每个防火墙请求匹配器创建一个动态服务并且 id 由 md5 和 sha1 加密...您可以覆盖参数.

查看 Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension

中的方法 createRequestMatcher

这显然不是一个好的做法,正如我在回应之前的评论时所说的那样,我承认,对于一个简单的 API 版本管理问题来说,它过于复杂了。我最终在 parameters.yml 文件中设置参数,因此当处理 security.yml 文件时,这不是问题,并将我的 API 管理逻辑放在 [=16= 的构建过程中].更有意义。 @Mocrates 非常感谢您的回答:)