В каждом приложении Laravel существует много настроек, в значении которых указывается заданное кол-во секунд или минут. Например, session.lifetime
или auth.password_timeout
и другие. По умолчанию они все имеют какое то целое число секунд, например 10800. Но сколько это? Некоторые параметры даже не имеют описания того, в каких единицах указываются.
Кто-то из нас поступает иначе. Число 10800 могут заменить на значение 3 * 60 * 60. Можно указывать такие значения и как интервалы дни * минуты * секунды. Но есть нюансы:
- При просмотре такого кода приходится напрягаться для анализа умножения.
- Не все интервалы могут могут исчисляться секундами, например,
10 * 60
(10 часов в минутах) и10 * 60
(10 минут в секундах). И вот тут могут появляться ошибки. - Все становится еще сложнее, когда вам нужен интервал типа “2 дня 6 часов” в секундах
(2 * 24 * 60 * 60) + (6 * 60 * 60)
К счастью, есть решение для обеих проблем.
Некоторое время назад @marcelpociot опубликовал это решение в Twitter.
В Laravel есть встроенная библиотека Carbon. Этот пакет предоставляет человеко понятный api для записи наших интервалов. Нас так же интересует метод totalSeconds: Например:
use Carbon\CarbonInterval;
CarbonInterval::days(2)->hours(6)->totalSeconds;
Такая запись намного легче читаема и большинство ошибок сами исчезают. Данный пакет полезен будет нам не только в конфигурации, но и в реальном коде, например в кеше TTL, в подписи в url-адресе для указания истечения срока действия и везде, где нам могут понадобиться указать интервалы времени.
Но данный код не будет работать с константами. Потому у нас остается нерешенная проблема с указанием констант числами. В примере ниже я первым комментарием указываю человеко понятное значение константы, а вторым комментарием указываю в каком формате хранится это значение. В секундах или минутах.
// 5 minutes
const DEFAULT_TTL = 5 * 60; // seconds
// 7 days
const REMINDER_DELAY = 7 * 24 * 60; // minutes
Во многих ситуациях вы захотите использовать .env переменные для определения ваших интервалов. Допустим у вас есть какая то работа, которая должна выполняться раз в неделю, но для тестирования вам необходимо будет запускать ее раз в минуту.
Решение простое: \Carbon\CarbonInterval::fromString()
. Метод принимает обычную строку с человеко понятным временем, например как в функции strtotime().
use Carbon\CarbonInterval;
return [
// ...
'password_reset_decay' => CarbonInterval::fromString(env('PASSWORD_RESET_DECAY', '7 days'))->totalSeconds,
// ...
];
И в вашем .env
файле вы можете определить следующие значения
# production
PASSWORD_RESET_DECAY="7 days"
# staging
PASSWORD_RESET_DECAY="1 day"
# development
PASSWORD_RESET_DECAY="6 hours"
# local
PASSWORD_RESET_DECAY="10 minutes"
Автор: Tom Witkowski