如何从Symfony2 config.yml读取configuration设置?

我已经添加了一个设置到我的config.yml文件,如下所示:

app.config: contact_email: somebody@gmail.com ... 

对于我的生活,我无法弄清楚如何将它读入一个variables。 我在我的一个控制器中尝试了这样的事情:

 $recipient = $this->container->getParameter('contact_email'); 

但是我得到一个错误说:

必须定义参数“contact_email”。

我已经清除了我的caching,在Symfony2重新加载的网站文档中,我也到处寻找,但我无法find如何做到这一点。

大概现在太累了,现在就解决这个问题。 有人能帮忙吗?

app.config定义contact_email ,而不是在parameters项中定义它:

 parameters: contact_email: somebody@gmail.com 

你应该能够发现你的控制器中正在进行的呼叫。

虽然将contact_email移动到parameters.yml的解决scheme很容易,正如其他答案中所提出的那样,如果处理多个bundle或者处理嵌套的configuration块,则可能会轻松地混淆参数文件。

  • 首先,我会严格回答这个问题。
  • 稍后,我将介绍如何从服务中获取这些configuration,而不用通过公共空间作为参数。

第一个方法:分离configuration块,将其作为参数

有了一个扩展( 在这里扩展更多 ),你可以很容易地将它们“分离”到config.yml不同块中,然后将其作为参数从控制器中获取。

DependencyInjection目录内的Extension类中写下:

 class MyNiceProjectExtension extends Extension { public function load( array $configs, ContainerBuilder $container ) { // The next 2 lines are pretty common to all Extension templates. $configuration = new Configuration(); $processedConfig = $this->processConfiguration( $configuration, $configs ); // This is the KEY TO YOUR ANSWER $container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] ); // Other stuff like loading services.yml } 

然后在你的config.yml,config_dev.yml中设置

 my_nice_project: contact_email: someone@example.com 

为了能够在config.yml处理MyNiceBundleExtension你还需要在同一个命名空间中有一个Configuration类:

 class Configuration implements ConfigurationInterface { public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder(); $rootNode = $treeBuilder->root( 'my_nice_project' ); $rootNode->children()->scalarNode( 'contact_email' )->end(); return $treeBuilder; } } 

然后你可以从你的控制器中得到你想要的configuration,但是保持parameters.yml清洁,并在config.yml中分开设置:

 $recipient = $this->container->getParameter( 'my_nice_project.contact_email' ); 

第二种方法:分离configuration块,将configuration注入到服务中

对于寻求类似服务的读者来说,甚至有一种更好的方式,不会混淆“参数”公共空间,甚至不需要将container传递给服务(通过整个容器就是实践避免)。

上面的这个技巧仍然“注入”到参数空间你的configuration。

不过,在加载服务的定义之后,可以添加一个像setConfig()这样的方法调用,将该块仅注入到服务中。

例如,在Extension类中:

 class MyNiceProjectExtension extends Extension { public function load( array $configs, ContainerBuilder $container ) { $configuration = new Configuration(); $processedConfig = $this->processConfiguration( $configuration, $configs ); // Do not add a paramater now, just continue reading the services. $loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) ); $loader->load( 'services.yml' ); // Once the services definition are read, get your service and add a method call to setConfig() $sillyServiceDefintion = $container->getDefinition( 'my.niceproject.sillymanager' ); $sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'contact_email' ] ) ); } } 

然后在你的services.yml像往常一样定义你的服务,没有任何绝对的改变:

 services: my.niceproject.sillymanager: class: My\NiceProjectBundle\Model\SillyManager arguments: [] 

然后在你的SillyManager类中,只需添加方法:

 class SillyManager { private $contact_email; public function setConfig( $newConfigContactEmail ) { $this->contact_email = $newConfigContactEmail; } } 

请注意,这也适用于数组而不是标量值! 想象一下,你configuration一个兔子队列,需要主机,用户和密码:

 my_nice_project: amqp: host: 192.168.33.55 user: guest password: guest 

当然,你需要改变你的树,但是你可以这样做:

 $sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) ); 

然后在服务上做:

 class SillyManager { private $host; private $user; private $password; public function setConfig( $config ) { $this->host = $config[ 'host' ]; $this->user = $config[ 'user' ]; $this->password = $config[ 'password' ]; } } 

希望这可以帮助!

我必须添加道格拉斯的答案,你可以访问全局configuration,但symfony翻译一些参数,例如:

 # config.yml ... framework: session: domain: 'localhost' ... 

 $this->container->parameters['session.storage.options']['domain']; 

您可以使用var_dump来search指定的键或值。

为了能够公开你的包的一些configuration参数,你应该参考这个文档。 这是相当容易的:)

以下是链接: 如何为Bundle公开语义configuration

就像之前所说 – 您可以通过使用注入容器访问任何参数并使用其参数属性。

“Symfony – 与容器服务定义合作”是一篇很好的文章。

我从http://tutorial.symblog.co.uk/的代码示例中学到了一种简单的方法;

1)注意ZendeskBlueFormBundle和文件的位置

 # myproject/app/config/config.yml imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: @ZendeskBlueFormBundle/Resources/config/config.yml } framework: 

2)通知Zendesk_BlueForm.emails.contact_email和文件位置

 # myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml parameters: # Zendesk contact email address Zendesk_BlueForm.emails.contact_email: dunnleaddress@gmail.com 

3)注意我如何得到$客户端和控制器的文件位置

 # myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request) { $client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email")); ... }