Encodera

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

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

Оглавление

Настройки и окружение

У приложения есть значения, которые отличаются на вашем компьютере и на сервере: пароль базы данных, режим отладки, имя сайта. Их не пишут прямо в коде. Такие значения хранят в файле .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).

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

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