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

j0pj023g  于 2022-11-25  发布在  其他
关注(0)|答案(7)|浏览(189)

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

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

在我的一生中,我都不知道如何将它读入一个变量。我在我的一个控制器中尝试了这样的操作:

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

但我得到一个错误消息:
必须定义参数“contact_email”。
我已经清空了缓存,我也到处找了Symfony2重新加载的站点文档,但我找不到如何做到这一点。
可能只是太累了,现在搞不清楚。谁能帮我吗?

iyr7buue

iyr7buue1#

不要在app.config中定义contact_email,而是在parameters条目中定义它:

parameters:
    contact_email: somebody@gmail.com

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

t5zmwmid

t5zmwmid2#

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

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

通过扩展(more on extensions here),您可以将其轻松地“分离”到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

为了能够在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' );

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

如果读者希望从服务中获取配置,那么还有一种更好的方法,它不会使“paramaters”公共空间变得混乱,甚至不需要将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' ];
    }
}

希望这对你有帮助!

w3nuxt5m

w3nuxt5m3#

我必须补充道格拉斯的答案,您可以访问全局配置,但symfony会转换一些参数,例如:

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

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

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

ulmd4ohb

ulmd4ohb4#

为了能够公开你的包的一些配置参数,你应该参考相关文档。这很容易做到:)
链接如下:How to expose a Semantic Configuration for a Bundle

eanckbw9

eanckbw95#

就像前面所说的那样,您可以通过使用注入容器和它的parameter属性来访问任何参数。
"Symfony - Working with Container Service Definitions"是一篇关于它的好文章。

pkwftd7m

pkwftd7m6#

我从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"));
    ...
    }
z9smfwbn

z9smfwbn7#

在控制器内部:

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

config/config.yaml获取配置:

parameters:
   configname: configvalue

相关问题