Настройки и окружение
У приложения есть значения, которые отличаются на вашем компьютере и на сервере: пароль базы данных, режим отладки, имя сайта. Их не пишут прямо в коде. Такие значения хранят в файле .env, а код читает их из одного места — массива настроек.
Установка
Файл .env читает пакет phpdotenv:
composer require vlucas/phpdotenvФайл .env
Создайте вручную файл .env в корне проекта, рядом с composer.json:
APP_DEBUG=true
SITE_NAME="Мой блог"Каждая строка — имя и значение. Это переменные окружения: на другом сервере в таком же файле будут другие значения.
Загрузка
Файл загружают в config/bootstrap.php, сразу после автозагрузчика:
// config/bootstrap.php
require __DIR__ . '/../vendor/autoload.php';
Dotenv\Dotenv::createImmutable(__DIR__ . '/..')->safeLoad();После этой строки значения доступны в массиве $_ENV. Метод safeLoad() не бросает ошибку, если файла нет, — на сервере переменные могут быть заданы иначе.
Массив настроек
Создайте config/settings.php. Это единственное место, где код обращается к $_ENV:
// config/settings.php
return [
'debug' => filter_var($_ENV['APP_DEBUG'] ?? false, FILTER_VALIDATE_BOOL),
'site_name' => $_ENV['SITE_NAME'] ?? 'Блог',
];Файл возвращает обычный массив. Значения из .env — всегда строки, поэтому filter_var() превращает строку true или false в логическое значение.
Настройки в контейнере
Чтобы настройки были доступны остальным частям приложения, добавьте их в config/container.php под именем settings:
// config/container.php
return [
'settings' => fn () => require __DIR__ . '/settings.php',
];Остальные записи файла остаются на месте — добавляется одна строка.
Использование
Простое значение контейнер не может подставить сам: по типу string не понять, какая строка нужна. Поэтому для класса, которому нужна настройка, пишут описание:
// config/container.php
use App\Action\HomeAction;
use Psr\Container\ContainerInterface;
return [
'settings' => fn () => require __DIR__ . '/settings.php',
HomeAction::class => fn (ContainerInterface $c) => new HomeAction(
$c->get('settings')['site_name'],
),
];// src/Action/HomeAction.php
final class HomeAction
{
public function __construct(private string $siteName) {}
public function __invoke(Request $request, Response $response): Response
{
$response->getBody()->write($this->siteName);
return $response;
}
}На главной странице появится «Мой блог». Измените SITE_NAME в .env и обновите страницу — текст изменится без правки кода.
Файл-образец
В .env позже появятся пароли, поэтому в систему контроля версий его не добавляют — впишите .env в файл .gitignore. Рядом держат .env.example с теми же именами, но без секретных значений: по нему понятно, какие переменные нужны проекту.
Частая ошибка
Запись (bool) $_ENV['APP_DEBUG'] не работает так, как ожидают: строка false — непустая, и PHP считает её истиной. Режим отладки окажется включён на сервере. Для логических значений используйте filter_var(..., FILTER_VALIDATE_BOOL).