正如其他答案中所建议的那样,尽管将其移动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
为了能够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;
}
}
然后,您可以按照原始问题的需要从控制器获取配置,但要保持parameters.yml
清洁,并config.yml
在单独的部分中进行设置:
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
第二种方法:分离配置块,将配置注入服务
对于正在寻找类似东西但要从服务中获取配置的读者,甚至有一种更好的方法,它永远不会使“参数”公共空间混乱,甚至不需要将container
其传递给服务(通过整个容器来实践)避免)。
上面的技巧仍然可以“注入”配置中的参数空间。
不过,在加载服务定义之后,您可以添加一个方法调用,例如setConfig()
,该方法调用仅将阻塞插入到服务中。
例如,在扩展类中:
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;
}
}
注意,这也适用于数组而不是标量值!想象一下,您配置了一个兔子队列并需要主机,用户和密码:
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' ];
}
}
希望这可以帮助!