Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Окружения, параметры и секреты

Одно и то же приложение работает на вашем компьютере, в тестах и на сервере — и в каждом месте ведёт себя по-своему: показывает или скрывает ошибки, шлёт письма по-настоящему или в заглушку. Этим управляют окружения и настройки.

Окружения

ОкружениеДля чегоОсобенности
devРазработкаПанель отладки, подробные ошибки, кеш пересобирается сам
testАвтоматические тестыОтдельная база, письма не отправляются
prodРабочий серверВсё кешируется, ошибки пишутся только в журнал

Окружение задаёт переменная APP_ENV.

Файлы .env

Symfony читает несколько файлов; значения из более поздних заменяют более ранние:

ФайлВ репозиторииНазначение
.envДаЗначения по умолчанию без секретов
.env.localНетНастройки вашего компьютера
.env.test, .env.prodДаЗначения для конкретного окружения
.env.prod.localНетСекреты конкретного сервера

Настоящие переменные окружения сервера важнее любого файла.

php bin/console debug:dotenv

Команда показывает, какие файлы прочитаны и какие значения получились.

Настройки для одного окружения

В файлах папки config/packages раздел when@ действует только в указанном окружении:

# config/packages/framework.yaml
framework:
    secret: '%env(APP_SECRET)%'
 
when@test:
    framework:
        test: true
 
when@prod:
    framework:
        http_cache: true

Параметры приложения

Свои значения, не зависящие от сервера, записывают в config/services.yaml:

parameters:
    app.posts_per_page: 20
    app.support_email: 'help@example.com'
use Symfony\Component\DependencyInjection\Attribute\Autowire;
 
class PostController extends AbstractController
{
    public function __construct(
        #[Autowire(param: 'app.posts_per_page')]
        private int $perPage,
    ) {}
}

В контроллере параметр можно прочитать и так: $this->getParameter('app.posts_per_page').

Преобразование переменных

Переменные окружения всегда строки. Приставка в %env()% преобразует значение:

parameters:
    app.debug_mail: '%env(bool:DEBUG_MAIL)%'
    app.cache_ttl: '%env(int:CACHE_TTL)%'
    app.admins: '%env(csv:ADMIN_EMAILS)%'
    app.features: '%env(json:FEATURES)%'
    app.region: '%env(default:app.default_region:REGION)%'

Хранилище секретов

Пароли и ключи рабочего сервера можно хранить в репозитории зашифрованными:

php bin/console secrets:generate-keys --env=prod
php bin/console secrets:set STRIPE_SECRET --env=prod
php bin/console secrets:list --env=prod

Секрет читается как обычная переменная — %env(STRIPE_SECRET)%. Зашифрованные файлы лежат в config/secrets/prod, а ключ расшифровки prod.decrypt.private.php в репозиторий не попадает: его кладут на сервер вручную или передают переменной SYMFONY_DECRYPTION_SECRET.

Проверка настроек

php bin/console debug:config framework
php bin/console debug:container --parameters
php bin/console debug:container --env-vars

Частая ошибка

Файл .env попадает в репозиторий — секретам в нём не место. Настоящие пароли и ключи записывают в .env.local, в переменные окружения сервера или в хранилище секретов. Если секрет уже попал в историю репозитория, удалить его оттуда недостаточно: ключ нужно заменить.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.