如何从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")); ... }