Человеко понятные интервалы времени при конфигурировании вашего приложения Laravel

В каждом приложении Laravel существует много настроек, в значении которых указывается заданное кол-во секунд или минут. Например, session.lifetime или auth.password_timeout и другие. По умолчанию они все имеют какое то целое число секунд, например 10800. Но сколько это? Некоторые параметры даже не имеют описания того, в каких единицах указываются.

Кто-то из нас поступает иначе. Число 10800 могут заменить на значение 3 * 60 * 60. Можно указывать такие значения и как интервалы дни * минуты * секунды. Но есть нюансы:

  1. При просмотре такого кода приходится напрягаться для анализа умножения.
  2. Не все интервалы могут могут исчисляться секундами, например, 10 * 60(10 часов в минутах) и 10 * 60(10 минут в секундах). И вот тут могут появляться ошибки.
  3. Все становится еще сложнее, когда вам нужен интервал типа “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

Рейтинг
( Пока оценок нет )
Максим Гречушников/ автор статьи
Мне 40 лет, и больше половины жизни я занимаюсь разработкой. За это время я работал с корпоративными системами, highload-проектами, интеграциями, платежными решениями, внутренними платформами и legacy-кодом, который пережил не одного разработчика. Некоторые системы, кажется, переживут и нас. Моя специализация — PHP, Laravel, backend-архитектура, DDD, тестирование, рефакторинг и техническое лидерство. Мне интересны задачи, где нужно соединить код, бизнес, данные, процессы и здравый смысл. Последние годы я много работаю с LLM и AI-инструментами: использую их для проектирования, анализа кода, документации, тестов, ревью, работы с legacy и построения инженерных процессов. Для меня LLM — это не замена разработчику, а усилитель для тех, кто умеет думать системно. В блоге я пишу о Laravel, PHP, архитектуре, тестировании, инженерной практике, управлении разработкой и реальном применении AI в работе программиста.
Понравилась статья? Поделиться с друзьями: