Окружения, параметры и секреты
Одно и то же приложение работает на вашем компьютере, в тестах и на сервере — и в каждом месте ведёт себя по-своему: показывает или скрывает ошибки, шлёт письма по-настоящему или в заглушку. Этим управляют окружения и настройки.
Окружения
| Окружение | Для чего | Особенности |
|---|---|---|
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, в переменные окружения сервера или в хранилище секретов. Если секрет уже попал в историю репозитория, удалить его оттуда недостаточно: ключ нужно заменить.