Symfony的2.8:在编译器传递的动态容器参数和security.yml

问题描述:

使用我现在面临一个问题,我自己可以在我的Symfony 2.8 API项目未解决:Symfony的2.8:在编译器传递的动态容器参数和security.yml

我有些放慢参数加载在编译过程在我的包之一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 _ *阳明文件,以确保它总是从数据库中检索+我用它在security.yml文件,如:

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

我该怎么做到这一点?显然,$ container-> setParameter('name',$ value);如果在参数_ *。yml文件中没有参数,并且在parameters.yml中有虚拟值,那么它不起作用 +我需要在security.yml被解析并加载之前设置这些值。 我已经看了几个小时的symfony核心,发现安全配置从kernel-> boot()进程加载,但我没有看到如何实现我想要的东西。

上的正确方法任何帮助或提示将高度赞赏:)

+2

所有的配置文件解析都是在调用任何pass之前完成的。所以,你会永远需要一个虚拟的价值。与setParameter无关。你可以看看SecurityBundle如何传递它的服务,并可能改变你传球中的定义。但是从通行证内部访问数据库是不寻常的。我怀疑它甚至会起作用。 – Cerad

+1

防火墙的目标是什么?如上所述,除非您重新编译应用程序,否则使用编译器pass将在编译时'app/console cache:warmup'充当db值的缓存,并且在db值不会更改。这在生产中会令人困惑和不受欢迎。使用[安全提供程序](https://symfony.com/doc/2.8/security/api_key_authentication.html#only-authenticating-for-certain-urls)在访问时验证用户更有意义,而不是在编译时间。然后你可以执行你自己的查询来验证每个请求的'api_version'。 – fyrye

+0

@Cerad,我从我的源代码中删除了这个,但是我确定它是可能的,也许是因为运气好的原则是在容器传递之前在容器中构建的?或者每个供应商的软件包都是在我之前生成的对不起,这些都是假设。 好吧,我看到如何改变安全服务的定义,但它是复杂的,我想达到什么,谢谢你的提示! – bohr

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

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

看到的Symfony \包\ SecurityBundle \ DependencyInjection \ SecurityExtension的方法createRequestMatcher

+0

*移动回答关闭问题* – bohr

+0

我同意,对我来说最好的解决方案是在配置文件 – Mocrates