dongyu9850
2017-10-07 14:26
浏览 44
已采纳

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

I'm facing an issue I can't solve by myself in my Symfony 2.8 API project:

I have some paramter loaded at compiler pass in the DependencyInjection of one of my bundle:

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);
    }
}

I dont want this parameter in paramters_*.yml files, to ensure it's ALWAYS retrieved from db + I use it in security.yml file, such as:

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

How can I achieved that ?

Apparently, $container->setParameter('name', $value); doesnt work if there isnt a parameter in parameter_*.yml file with dummy value in parameters.yml + I need to set these values BEFORE security.yml gets parsed and loaded. I have look into symfony core for hours, spotted where security config is loaded from kernel->boot() process but I dont see how to achieve what I want properly.

Any help or hints on the proper method would be highly appreciated :)

图片转代码服务由CSDN问答提供 功能建议

我遇到的问题是我自己在Symfony 2.8 API项目中无法解决的问题:

我在我的一个bundle的DependencyInjection中的编译器传递中加载了一些参数:

 类ParametersCompilerPass实现CompilerPassInterface 
 {
公共函数进程 (ContainerBuilder $ container)
 {
 // //在构建容器时从数据库加载api版本。
 $ api_version = $ container-> get('doctrine') - > getRepository('MyAppEntityBundle:Parameter')\  n  - > findOneBy(['name'=>'api_version']); 
 if(!$ api_version){
 throw new MyAppException('容器构建过程中无法在数据库中找到'api_version'。); \  n} 
 $ container-> setParameter('api_version',$ api_version); 
} 
} 
   
 
 

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

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

我怎样才能实现这一目标?

显然,$ container-> setParameter('name',$ value); 如果参数_ *。yml文件中的参数没有参数,参数中的虚拟值。在错误的情况下,我需要设置这些值。在解析和加载安全性时,我需要设置这些值。 我已经看了几个小时的symfony核心,发现安全的地方 config是从kernel-> boot()进程加载的,但我没看到如何正确实现我想要的。

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

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

2条回答 默认 最新

相关推荐 更多相似问题