Как освоить и создавать новые окружения

Каждое приложение - это комбинация кода и набора конфигурации, которая диктует, как должен функционировать код. Конфигурация может определять используемую БД, нужно ли что-либо кешировать или степень многословности ведения записи логов.

В Symfony идея "окружений" заключается в том, что одна и та же кодовая база может быть выполнена с использованием множества разных конфигураций. Например, окружение dev должно использовать конфигурацию, которая делает разработку лёгкой и дружественной, в то время, как окружение prod должно использовать набор конфигурации, оптимизированный для скорости.

Разные окружения, разные файлы конфигурации

Типичное приложение Symfony начинается с трёх окружений: dev, prod, и test. Как уже было сказано, каждое окружение представляет собой способ выполнять одну кодовую базу с разными конфигурациям. Поэтому не должно быть сюрпризом, что каждое окружение загружает свой собственные файлы конфигурации. Эти разные файлы упорядочены по окружению:

  • для окружения dev: config/packages/dev/
  • для окружения prod: config/packages/prod/
  • для окружения test: config/packages/test/

В действительности, каждое окружение лишь слегка отличается от других. Это означает, что все окружения имеют общую большую базу конфигураций. Эта конфигурация размещается в файлах напрямую в каталоге config/packages/.

Расположение этих файлов определяется ядром приложения:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// src/Kernel.php

// ...
class Kernel extends BaseKernel
{
    // ...

    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
    {
        // ...
        $confDir = $this->getProjectDir().'/config';

        // всегда загружать все файлы в /config/packages/
        $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');

        // потом,если возможно, загружать файлы в определённом каталоге окружения
        if (is_dir($confDir.'/packages/'.$this->environment)) {
            $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');
        }

        // загружать специальный services.(yaml/xml/php) и, если возможно, файл services_ENVIRONMENT.(yaml/xml/php)
        $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob');
    }
}

Возьмите пакет фреймворка, установленный по умолчанию, в качестве примера:

  • Загружается во всех окружениях, config/packages/framework.yaml конфигурирует фреймворк с некоторой установкой secret;
  • В окружении prod не будет установлено ничего дополнительного, так как нет каталога config/packages/prod/;
  • То же самое применимо к dev, так как нет config/packages/dev/framework.yaml. Однако существуют другие пакеты (например, routing.yaml) со спецальными настройками для dev;
  • Наконец, в окружении test, функции теста фреймворка включаются в config/packages/test/framework.yaml.

Выполнение приложения в разных окружениях

Чтобы выполнить приложение в каждом окружении, измените переменную окружения APP_ENV. Во время разработки это делается в .env:

1
2
3
4
5
# .env
APP_ENV=dev

# или для теста:
#APP_ENV=test

Перейдите на страницу http://localhost:8000/index.php в вашем веб-браузере, чтобы увидеть ваше приложение в сконфигурированном окружении.

Tip

В производстве рекомендуется конфигурировать переменные окружения в вашей конфигурации веб-сервера.

Note

Данные URL предполагают, что ваш веб-сервер сконфигурирован так, чтобы использовать каталог приложение public/ в качестве корневого. Прочтите больше в Установке Symfony.

Если вы откроете файл, который вы только что посетили (public/index.php), то вы увидите, что переменная окружения передаётся ядру:

1
2
3
4
5
6
// public/index.php

// ...
$kernel = new Kernel($_SERVER['APP_ENV'] ?? 'dev', $_SERVER['APP_DEBUG'] ?? false);

// ...

Вы также можете заменить $_SERVER['APP_ENV'] ?? 'dev' просто на 'dev', чтобы всегда выполнять приложение в окружении разработки, независимо от переменной APP_ENV.

Note

Окружение test используется при написании функциональных тестов и оно недоступно в браузере напрямую через фронт-контроллер.

Важным, но не имеющим отношения к теме окружений, является второй аргумент конструктора Kernel. Он указывает, должно ли приложеие работать в "режиме отладки". Несмотря на окружение, приложение Symfony может быть запущено с режимом отладки, установленным как true или false (1 или 0 соответственно для переменной APP_DEBUG, определённой в .env). Это влияет на многие вещи в приложении, такие как отображение трассы вызовов в стеке на страницах ошибки или на динамическую перестройку файлов кеша по каждому запросу. Хоть это и не является требованием, режим отладки обычно установлен как true для окружений dev и test, и как false для окружения prod.

Внутренне, значение режима отладки становится параметром kernel.debug, используемым внутри сервис-контейнера. Если вы посмотрите внутрь файла конфигурации приложения, вы увидите, что используемый параметр, например, включает режим отладки Twig:

  • YAML
    1
    2
    3
    # config/packages/twig.yaml
    twig:
        debug: '%kernel.debug%'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/twig
            http://symfony.com/schema/dic/twig/twig-1.0.xsd">
    
        <twig:config debug="%kernel.debug%" />
    
    </container>
    
  • PHP
    1
    2
    3
    4
    $container->loadFromExtension('twig', array(
        'debug' => '%kernel.debug%',
        // ...
    ));
    

Выбор окружения для консольных команд

По умолчанию, команды Symfony выполняются в том окружении, которое определяется переменной окружения APP_ENV (обычно конфигурируется в вашем файле .env)`.

Используйте опции --env и --no-debug, чтобы настроить это поведение:

1
2
3
4
5
6
7
8
# окружение 'dev', отладка включена
$ php bin/console command_name

# окружение 'prod' (отладка всегда отключена для 'prod')
$ php bin/console command_name --env=prod

# окружение 'test', отладка выключена
$ php bin/console command_name --env=test --no-debug

Создание нового окружения

Так как окружение - это не более, чем строка, соответствующая набору конфигурации, создать его достаточно просто.

Представьте, к примеру, что перед развёртыванием вам нужно провести сравнительный тест вашего приложения. Одним способом проведения сравнения вашего приложения является использование около-производственных настроек с включённым web_profiler Symfony. Это позволяет Symfony записывать информацию о вашем приложени во время проведения сравнительного теста.

Наилучший способ достичь этого - через новое окружение, названное, например, benchmark. Начните с создания нового каталога и файла конфигурации:

  • YAML
    1
    2
    3
    # config/packages/benchmark/web_profiler.yaml
    framework:
        profiler: { only_exceptions: false }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- config/packages/benchmark/web_profiler.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:framework="http://symfony.com/schema/dic/symfony"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/symfony
            http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <framework:config>
            <framework:profiler only-exceptions="false" />
        </framework:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    // config/packages/benchmark/web_profiler.php
    $container->loadFromExtension('framework', array(
        'profiler' => array('only_exceptions' => false),
    ));
    

И... вы закончили! Теперь приложение поддерживает новое окружение под названием benchmark.

Измените переменную APP_ENV на benchmark, чтобы иметь доступ к новому окружению в вашем браузере:

1
2
# .env
APP_ENV=benchmark

Кроме загрузки файлов в ядре, вы также можете импортировать файлы в конфигурацию напрямую. Например, чтобы убедиться, что окружение benchmark идентично окружению производства, вы можете захотеть также загрузить всю его конфигурацию.

Вы можете достичь этого, используя спеиальный клюс imports:

Окружения и каталог кеша

Symfony во многом пользуется преимуществами кеширования: конфигурация приложения, конфигурация маршрутизации, шаблоны Twig и многое другое кешируется в PHP-объекты, хранящиеся в файлах файловой системы.

По умолчанию, эти кешированные файлы в основном хранятся в каталоге var/cache/. Однако, каждое окружение кеширует свой собственный набор файлов:

1
2
3
4
5
6
your-project/
├─ var/
│  ├─ cache/
│  │  ├─ dev/   # cache directory for the *dev* environment
│  │  └─ prod/  # cache directory for the *prod* environment
│  ├─ ...

Иногда при отладке может быть полезным инспектировать кешированный файл, чтобы понять, как что-то работает. Если будете так делать, не забудьте посмотреть в каталог окружения, которое вы используете (чаще всего dev/ при разработке и отладке). Несмотря на возможные различия, каталог var/cache/dev/ включает в себя следующее:

appDevDebugProjectContainer.php
Кешированный "сервис-контейнер", который представляет кешированную конфигурацию приложения.
appDevUrlGenerator.php
PHP-класс сгенерированный из конфигурации маршрутизации и используемый при генерировании URL.
appDevUrlMatcher.php
PHP-класс, используемый для сопоставления маршрутов - смотрите сюда, чтобы увидеть скомпилированную логику регулярных выражений, используемую для сопоставления входящих URL с разными маршрутами.
twig/
Этот каталог кодержит все кешированные шаблоны Twig.

Note

Вы можете с лёгкостью изменить локацию и имя каталога. Чтобы узнать больше, прочтите статью How to Override Symfony's default Directory Structure.

Дальнейшее продвижение

Прочтите статью о How to Set external Parameters in the Service Container.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.