2016-03-08 112 views
0

我有一个symfony2应用程序。我们之前已经为开发建立了一个docker-compose栈,这就是为什么我们希望它的所有配置都是通过环境变量而不是parameters.yml进行设置的。如何修复ParameterCircularReferenceException?

因此,我取代了我parameters.yml的内容来源:

parameters: 
    locale: 'en' 
    secret: 'SOME_SECURITY_TOKEN' 
    ... 

到:

parameters: 
    locale: '%locale%' 
    secret: '%secret%' 
    ... 

docker-compose.yml文件包含:

my_app: 
    hostname: my-app 
    build: . 
    dockerfile: Dockerfile.dev 
    ports: 
     - "9080:80" 
     - "9043:433" 
    environment: 
     LOCALE: en 
     SECRET: SOME_SECURITY_TOKEN 
     ... 

然而,重建我的容器后,我获得例外:

ParameterCircularReferenceException in ParameterBag.php line 209: Circular reference detected for parameter "secret" ("secret" > "secret"). 
    1. in ParameterBag.php line 209 
    2. at ParameterBag->resolveString('%secret%', array('secret' => true)) in ParameterBag.php line 185 
    3. at ParameterBag->resolveValue('%secret%', array('secret' => true)) in ParameterBag.php line 214 
    4. at ParameterBag->resolveString('%secret%', array('secret' => true)) in ParameterBag.php line 185 
    5. at ParameterBag->resolveValue('%secret%', array()) in ParameterBag.php line 175 
    6. at ParameterBag->resolveValue(array('secret' => '%secret%', 'router' => array('resource' => '%kernel.root_dir%/config/routing.yml', 'strict_requirements' => null), 'form' => null, 'csrf_protection' => 
     null, 'validation' => array('enable_annotations' => true), 'templating' => array('engines' => array('twig')), 'default_locale' => '%locale%', 'trusted_hosts' => null, 'trusted_proxies' => null, 
     'session' => array('handler_id' => 'api.session.handler.memcached'), 'fragments' => null, 'http_method_override' => true), array()) in ParameterBag.php line 175 
    7. at ParameterBag->resolveValue(array(array('secret' => '%secret%', 'router' => array('resource' => '%kernel.root_dir%/config/routing.yml', 'strict_requirements' => null), 'form' => null, 
     'csrf_protection' => null, 'validation' => array('enable_annotations' => true), 'templating' => array('engines' => array('twig')), 'default_locale' => '%locale%', 'trusted_hosts' => null, 
     'trusted_proxies' => null, 'session' => array('handler_id' => 'api.session.handler.memcached'), 'fragments' => null, 'http_method_override' => true), array('router' => 
     array('resource' => '%kernel.root_dir%/config/routing_dev.yml', 'strict_requirements' => true), 'profiler' => array('only_exceptions' => false)))) in MergeExtensionConfigurationPass.php line 45 
    8. at MergeExtensionConfigurationPass->process(object(ContainerBuilder)) in MergeExtensionConfigurationPass.php line 39 
    9. at MergeExtensionConfigurationPass->process(object(ContainerBuilder)) in Compiler.php line 107 
    10. at Compiler->compile(object(ContainerBuilder)) in ContainerBuilder.php line 589 
    11. at ContainerBuilder->compile() in bootstrap.php.cache line 2687 
    12. at Kernel->initializeContainer() in bootstrap.php.cache line 2465 
    13. at Kernel->boot() in bootstrap.php.cache line 2496 
    14. at Kernel->handle(object(Request)) in app_dev.php line 30 

然而,在我的容器我也看到了ENV变量:

le-container:/var/www/my-app# env 
SECRET=SOME_SECURITY_TOKEN 
LOCALE=en 

什么我做错了,如何解决呢?

回答

1

出于某种原因,添加前缀到我的环境变量固定的问题:

parameters: 
    locale: '%foo_locale%' 
    secret: '%foo_secret%' 

当然每当变量设置为好和。我目前的工作理论是,symfony不喜欢具有相同的参数名称和env变量,但我不确定。

+1

你的描述是什么;-)的parameterbag级解析“参数值谱写”并在它们的parameters.yml中查找,所以这是无止境的 –

+0

@johnSmith看起来你已经在symfony2源代码中找到了负责任的部分。你能否添加一个链接到相关部分?我想我会在他们的github上公开一个关于它的问题。 – k0pernikus

+0

我认为你误解了,你的实际问题是参数名称是相等的,所以类解析引用并再次在parameters.yml中找到引用,等等,但它是一个内置功能使用外部参数;-) –

0
parameters: 
    locale: '%locale%' 
    secret: '%secret%' 

是无用的建设,现场和秘密已经是参数。只要删除这个块。

+0

我通过环境变量注入值。 – k0pernikus

0

有一个解决方案使用external parameters。用“SYMFONY__”前缀你的变量。在你的情况将是:

my_app: 
    ... 
    environment: 
     SYMFONY__APP__LOCALE: en 
     SYMFONY__APP__SECRET: SOME_SECURITY_TOKEN 
    ... 

而在你的参数,你可以把它叫做如下:

parameters: 
    locale: %app.locale% 
    secret: %app.secret%