symfony4 доступ к вложенным параметрам - PullRequest
0 голосов
/ 04 января 2019

У меня есть несколько параметров, связанных с конфигурацией AWS, мне нужно получить доступ из моего сервиса. Обычно я добавляю ParameterBagInterface в сервис, если мне нужно несколько параметров, и использую его для получения нужных мне параметров, таким образом, мне не нужно проверять, действительно ли параметр существует, и обрабатывать его самостоятельно, как * 1002. * бросая ParameterNotFoundException, если параметр не существует.

Но чтобы ParameterBag работал так, как мне нужно, необходимо добавить параметры в service.yml, например:

aws.default_one: '%env(AWS_DEFAULT_BUCKET)%' 
aws.default_two: '%env(AWS_DEFAULT_BUCKET)%'

и теперь я могу достать его из сумки вот так $this->parameterBag->get('aws.default_one')

Но синтаксис yml позволяет добавлять вложенные параметры, поэтому я могу добавить параметры в конфигурацию следующим образом:

aws:
    default_one: '%env(AWS_DEFAULT_BUCKET)%' 
    default_two: '%env(AWS_DEFAULT_BUCKET)%'

это выглядит намного чище и более читабельно, особенно когда у вас много параметров, но таким образом я не могу просто написать $this->parameterBag->get('aws.default_one') (это выдаст ошибку Параметр "aws.default_one" должен ) и единственный способ получить его из пакета параметров, который я нашел, - это $this->parameterBag->get('aws')['default_one'], но тогда вообще не имеет смысла использовать пакет параметров, так как вам все еще нужно выполнить проверку самостоятельно, чтобы проверить, если default_one ключ существует и обрабатывать его. И в таком случае вместо передачи всего пакета параметров я могу просто передать %aws% службе и работать с ней как с массивом php.

Итак, вопросы:

  • Какова лучшая практика для добавления списка параметров в сервис, введите пакет параметров или просто передайте каждый параметр или массив Вложенные параметры в сервис?
  • может быть, есть какой-то способ получить вложенный параметр, используя точечную запись, вместо того, чтобы делать, как $this->parameterBag->get('aws')['default_one'], поскольку это облегчает жизнь с использованием только пакета параметров, который выдает исключение?

1 Ответ

0 голосов
/ 06 января 2019

Обычно параметры вводятся и определяются в разделе аргументов вашего сервиса:

    App\Service\MyService:
    arguments:
        $config:
            access_token: '%env(resolve:ACCESS_TOKEN)%'
            environment: '%env(resolve:SPEC_ENV)%'

Здесь я использую параметры среды, но это не имеет значения, вы можете использовать обычное значение. Если вам нужно ввести несколько параметров:

    App\Service\MyService:
    arguments:
        $access_token: '%env(resolve:ACCESS_TOKEN)%'
        $environment: '%env(resolve:SPEC_ENV)%'

И определение вашего сервиса будет выглядеть так:

public function __construct($access_token, $environment)
{
    //...
}

Также из документации:

б. нотация - это соглашение Symfony, облегчающее чтение параметров. Параметры являются плоскими элементами значения ключа, они не могут быть организованы во вложенный массив

То, что вы пытаетесь сделать, это дерево конфигурации, которое больше подходит для общедоступных пакетов: https://symfony.com/doc/current/bundles/configuration.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...