如何从symfony2 config.yml读取配置设置?

我在config.yml文件中添加了如下设置:

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

对于我来说,我不知道如何把它读成一个变量。我在我的一个控制器中尝试了类似的东西:

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

但我得到一个错误:

参数“联系人_电子邮件”必须为 已定义.

我已经清除了我的缓存,我还到处查看了Symfony2重新加载的站点文档,但我找不到如何做到这一点。

可能只是太累了,现在想不出来。有人能帮忙吗?

166216 次浏览

与其在app.config中定义contact_email,不如在parameters条目中定义它:

parameters:
contact_email: somebody@gmail.com

您应该会发现您在控制器中进行的调用现在可以正常工作。

我必须补充一下Douglas的回答,您可以访问全局配置,但symfony会转换一些参数,例如:

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

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

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

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

“ symfony-使用容器服务定义”是一篇关于它的好文章。

为了能够公开您的包的一些配置参数,您应该参考文档来执行此操作。这很容易做到:)

以下是链接:如何公开捆绑包的语义配置

虽然将contact_email移动到parameters.yml的解决方案很简单,但正如其他答案中所建议的那样,如果您处理许多包或嵌套的配置块,则很容易使您的参数文件变得混乱。

  • 首先,我将严格回答这个问题。
  • 稍后,我将给出一种从服务获取这些配置的方法,而无需通过公共空间作为参数传递。

第一种方法:分离配置块,将其作为参数获取

通过扩展(这里有更多关于扩展的信息。),您可以轻松地将其“分离”到config.yml中的不同块中,然后将其作为可从控制器获得的参数注入。

在您的扩展类中,在DependencyInjection目录中,写下以下内容:

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

为了能够在MyNiceBundleExtension中处理该config.yml,还需要在同一名称空间中有一个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;
}
}

然后,您可以从控制器获取配置,正如您在最初的问题中所希望的那样,但要保持parameters.yml干净,并在config.yml中将其设置在单独的部分中:

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

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

对于寻找类似的东西但又想从服务获取配置的读者来说,还有一种更好的方法,它永远不会弄乱“参数”公共空间,甚至不需要将container传递给服务(传递整个容器是要避免的)。

上面的技巧仍然“注入”到配置的参数空间中。

然而,在加载服务的定义之后,您可以添加一个方法调用,例如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;
}
}

请注意,这也适用于数组而不是标量值。假设您配置了一个Rabbit队列,并且需要主机、用户和密码:

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' ];
}
}

希望这能有所帮助!

我从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_电子邮件和文件位置

# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml


parameters:
# Zendesk contact email address
Zendesk_BlueForm.emails.contact_email: dunnleaddress@gmail.com

3)注意我是如何在控制器的$CLIENT和文件位置中获取它的

# 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"));
...
}

控制器内部:

$this->container->getParameter('configname')

要从config/config.yaml中获取配置:

parameters:
configname: configvalue