Типобезопасный каст значений из env() в config
Вы когда-нибудь ловили TypeError, просто потому что .env вернул строку вместо числа? Или получали неожиданное поведение из-за опечатки в булевом флаге falose вместо false?
🚨 Проблема
В файле .env можно задать некорректные значения, которые затем попадают в конфиг. В результате приложение может неожиданно падать с ошибкой 500 или вести себя непредсказуемо.
Пакет sushi-market/smart-cast
🔗 github.com/sushi-market/smart-cast
Этот пакет решает проблему: мы можем добавить уровень типобезопасной валидации и каста прямо в конфиг файлах. Если значение в .env невалидно — приложение сразу упадёт понятной ошибкой, а не в случайный момент времени.
Сейчас у нас есть два основных каста: stringToInt и stringToFloat
Передавая параметры в функцию, мы можем строго проверять значения в момент каста:
sign – если передано, то ограничивает значение только положительным или отрицательным. Полезно, например, для настройки TTL, который не может быть отрицательным.
strictType – по умолчанию true
При true каст "123.45" в int вызовет ошибку. Если указать false, значение будет приведено, но лучше оставлять строгий режим.
acceptsZero – по умолчанию true
Если установить false, ноль вызовет ошибку. Удобно для параметров вроде port.
acceptNull – по умолчанию false
Если true, то переданный null вернёт null вместо исключения – полезно для опциональных значений в конфиге.
Примеры использования
- Валидация числового значения:
Интервал должен быть целым положительным числом больше 0.
'default_interval_length' => stringToInt(
value: env('INTERVALS_DEFAULT_LENGTH', 15),
sign: \DF\NumberSign::POSITIVE,
acceptsZero: false,
),
- Валидация булевого значения:
debug может быть только true или false. Это исключает опечатки вроде falose, которые интерпретатор воспримет как true.
'debug' => stringToBoolean(
value: env('APP_DEBUG', false),
),
Пакет можно использовать не только в конфигурационных файлах, но и в любом месте кода, однако именно в конфиге его польза проявляется особенно ярко.