Як встановлювати зовнішні параметри в сервіс-контейнері

Дата оновлення перекладу 2022-05-10

Як встановлювати зовнішні параметри в сервіс-контейнері

В Конфігурація Symfony ви дізналися, як управляти конфігурацією вашого додатку. В деяких випадках вашому додатку може піти на користь зберігання деяких сертифікатів поза кодом вашого проекту. Конфігурація бази даних є одним з таких прикладів. Гнучкість сервіс-контейнера Symfony дозволяє вам з легкістю робити це.

Змінні середовища

Ви можете посилатися на зміння середовища, використовуючи спеціальні параметри, які названі на честь тих змінних, які ви хочете використовувати, оточені env(). Їх справжні значення будуть дозволені під час прогону (один раз на запит), щоб скинути контейнери могли бути знов динамічно сконфігуровані навіть після компіляції.

Наприклад, при встановленні рецепту doctrine, конфігурація DB розміщується у змінній середовища DATABASE_URL:

1
2
# .env
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"

На цю змінну посилаються в конфігурації сервіс-контейнера, використовуючи %env(DATABASE_URL)%:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/doctrine.yaml
doctrine:
    dbal:
        url: '%env(DATABASE_URL)%'
    # ...

Ви також можете давати параметрам env() значення за замовчуванням: значення за замовчуванням буде використане кожен раз, коли не знайдено відповідну змінну середовища:

  • YAML
  • XML
  • PHP
1
2
3
# config/services.yaml
parameters:
    env(DATABASE_HOST): localhost

Конфігурація змінних середовища у виробництві

Під час розробки ви використовуватимете файл .env, щоб сконфігурувати ваші змінні середовища. На вашому сервері виробництва рекомендовано конфігурувати змінні на рівні веб-серверу. Якщо ви використовуєте Apache або Nginx, то ви можете використовувати, наприклад, наступне:

  • Apache
  • Nginx
1
2
3
4
5
<VirtualHost *:80>
    # ...

    SetEnv DATABASE_URL "mysql://db_user:db_password@127.0.0.1:3306/db_name"
</VirtualHost>

Caution

Майте на увазі, що скидання змісту змінних $_SERVER та $_ENV або виведення змісту phpinfo() відобразить значення змінних середовища, оголюючи чутливу інформацію, на кшталт сертифікатів бази даних.

Значення змінних середовища також відображаються у веб-інтерфейсі Symfony профільувальника. На практиці це не повинно бути проблемаою, тому що веб-профільувальник ніколи не має бути увімкнений у виробництві.

Процесори змінних середовища

3.4

Процесори змінних середовища з'явилися в Symfony 3.4.

Значення змінних середовища за замовчуванням вважаються рядками. Однак ваш код може очікувати інші типи даних, наприклад, цілі числа або булеві значення. Symfony вирішує цю проблему процесорами, які перетворюють зміст вказаних змінних середовища. Наступний приклад використовує процесор цілих чисел для перетворення значення змінної середовища HTTP_PORT в ціле число:

  • YAML
  • XML
  • PHP
1
2
3
4
# config/packages/framework.yaml
framework:
    router:
        http_port: env(int:HTTP_PORT)

Symfony надає наступні процесори змінних середовища:

env(string:FOO)

Перетворює FOO в рядок:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
parameters:
    env(SECRET): 'some_secret'
framework:
   secret: '%env(string:SECRET)%'
env(bool:FOO)

Перетворює FOO в булеве значення:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
parameters:
    env(HTTP_METHOD_OVERRIDE): 'true'
framework:
   http_method_override: '%env(bool:HTTP_METHOD_OVERRIDE)%'
env(int:FOO)
Перетворює FOO в значення цілого числа.
env(float:FOO)
Перетворює FOO в дробове число.
env(const:FOO)

Знаходить значення константи, визначеної в FOO:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
# config/packages/security.yaml
parameters:
    env(HEALTH_CHECK_METHOD): 'Symfony\Component\HttpFoundation\Request::METHOD_HEAD'
security:
   access_control:
     - { path: '^/health-check$', methods: '%env(const:HEALTH_CHECK_METHOD)%' }
env(base64:FOO)
Декодує зміст FOO, яке є закодованим base64 рядком.
env(json:FOO)

Декодує зміст FOO, яке є закодованим JSON рядком. Повертає масив або null:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
parameters:
    env(TRUSTED_HOSTS): '["10.0.0.1", "10.0.0.2"]'
framework:
   trusted_hosts: '%env(json:TRUSTED_HOSTS)%'
env(resolve:FOO)

Замінює рядок FOO значенням конфігураційного параметру з цим значенням:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
# config/packages/sentry.yaml
parameters:
    env(HOST): '10.0.0.1'
    env(SENTRY_DSN): 'http://%env(HOST)%/project'
sentry:
    dsn: '%env(resolve:SENTRY_DSN)%'
env(csv:FOO)

Декодує зміст FOO, яке є закодованим CSV рядком:

1
2
3
4
parameters:
    env(TRUSTED_HOSTS): "10.0.0.1, 10.0.0.2"
framework:
   trusted_hosts: '%env(csv:TRUSTED_HOSTS)%'

4.1

Процесор csv з'явився в Symfony 4.1.

env(file:FOO)

Повертає зміст файлу, шлях до якого вказано у змінній середовища FOO:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
parameters:
    env(AUTH_FILE): '../config/auth.json'
google:
    auth: '%env(file:AUTH_FILE)%'

Можна також комбінувати будь-яку кількість процесорів:

1
2
3
4
5
6
7
8
parameters:
    env(AUTH_FILE): "%kernel.project_dir%/config/auth.json"
google:
    # 1. отримує значення змінної середовища AUTH_FILE
    # 2. замінює значення конфігураційним параметром для отримання шляху до конфігурації
    # 3. отримує зміст файлу, збереженого за цим шляхом
    # 4. JSON-декодує зміст файлу та повертає його
    auth: '%env(json:file:resolve:AUTH_FILE)%'

Користувацькі процесори змінних середовища

Також можливо додавати власні процесори для користувацьких змінних. Спочатку створіть клас, який реалізує EnvVarProcessorInterface, а потім визначте сервіс для цього класу:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class LowercasingEnvVarProcessor implements EnvVarProcessorInterface
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function getEnv($prefix, $name, \Closure $getEnv)
    {
        $env = $getEnv($name);

        return strtolower($env);
    }

    public static function getProvidedTypes()
    {
        return [
            'lowercase' => 'string',
        ];
    }
}

Константи

Контейнер також має підтримку для установки PHP-констант в якості параметрів. Див. Введение в параметры, щоб дізнатися більш детально.

Змішана конфігурація

Ви можете змішувати будь-які формати конфігурації на свій смак (YAML, XML та PHP) в config/packages/. Імпорт PHP-файлу дає вам можливість додавати все, що потрібно, в контейнер. Наприклад, ви можете створити файл drupal.php, в якому ви встановите URL бази даних, заснований на конфігурації DB Drupal:

1
2
3
4
5
6
7
// config/packages/drupal.php

// імпортувати конфігурацію Drupal
include_once('/path/to/drupal/sites/default/settings.php');

// встановити параметр app.database_url
$container->setParameter('app.database_url', $db_url);