Symfony 2.8:编译器传递时的动态容器参数,用于security.yml

时间:2017-10-07 14:26:53

标签: php symfony parameters compiler-construction containers

我遇到了一个问题,我无法在Symfony 2.8 API项目中自行解决:

我在我的一个bundle的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()过程加载安全配置的地方,但我没看到如何正确实现我想要的。

任何有关正确方法的帮助或提示都将受到高度赞赏:)

2 个答案:

答案 0 :(得分:1)

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

在Symfony \ Bundle \ SecurityBundle \ DependencyInjection \ SecurityExtension中查看方法createRequestMatcher

答案 1 :(得分:1)

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