Как мне прочитать параметры конфигурации из Symfony2 config.yml? - PullRequest
188 голосов
/ 27 января 2011

Я добавил параметр в мой файл config.yml следующим образом:

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

Что касается меня, я не могу понять, как читать это в переменную. Я попробовал что-то подобное в одном из моих контроллеров:

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

Но я получаю сообщение об ошибке:

Параметр "contact_email" должен быть определены.

Я очистил кэш, я также посмотрел всю документацию по перезагрузке сайта Symfony2, но не могу найти, как это сделать.

Возможно, просто слишком устал, чтобы понять это сейчас. Кто-нибудь может помочь с этим?

Ответы [ 6 ]

193 голосов
/ 30 января 2011

Вместо определения contact_email в app.config определите его в записи parameters:

parameters:
    contact_email: somebody@gmail.com

Вы должны найти, что звонок, который вы делаете в вашем контроллере, теперь работает.

168 голосов
/ 24 марта 2014

Хотя решение о перемещении contact_email в parameters.yml легко, как предлагается в других ответах, это может легко загромождать ваш файл параметров, если вы имеете дело со многими пакетами или если вы имеете дело с вложенными блоками конфигурации.

  • Во-первых, я строго отвечу на вопрос.
  • Позже я дам подход к получению этих конфигов от сервисов, даже не передавая их через общее пространство в качестве параметров.

ПЕРВЫЙ ПОДХОД: отдельный блок конфигурации, получение его в качестве параметра

С расширением ( подробнее о расширениях здесь ) вы можете легко это сохранить«разделить» на различные блоки в config.yml и затем добавить это как параметр, получаемый из контроллера из таблицы.

Внутри вашего класса Extension внутри каталога 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 втот же самый намespace:

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

Обратите внимание, что это также работает для массивов вместо скалярных значений!Представьте, что вы настраиваете кроличью очередь и нуждаетесь в хосте, пользователе и пароле:

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

Надеюсь, это поможет!

34 голосов
/ 08 августа 2012

Я должен добавить к ответу Дугласа, вы можете получить доступ к глобальной конфигурации, но Symfony переводит некоторые параметры, например:

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

есть

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

Вы можете использовать var_dump для поиска указанного ключа или значения.

17 голосов
/ 15 апреля 2013

Чтобы иметь возможность выставить некоторые параметры конфигурации для вашего комплекта, вам следует обратиться к документации для этого.Это довольно легко сделать:)

Вот ссылка: Как предоставить семантическую конфигурацию для пакета

7 голосов
/ 02 октября 2012

Как было сказано ранее - вы можете получить доступ к любым параметрам с помощью контейнера для инъекций и использовать его свойство параметра.

«Symfony - Работа с определениями службы контейнера» - хорошая статья об этом.

3 голосов
/ 16 ноября 2014

Я узнал простой способ из примера кода 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) обратите внимание, как я получаю его в $ 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"));
    ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...