Человеко понятные интервалы времени при конфигурировании вашего приложения 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

Рейтинг
( Пока оценок нет )
Maxyc Webber/ автор статьи
Мне 35 лет. Опыт профессиональной разработки 15 лет. Занимаюсь разработкой и поддержкой корпоративных систем автоматизации бизнеса, а также высоконагруженными проектами. Мне нравится решать нестандартные проблемы бизнеса. Имею опыт формирования команд под проект, налаживания процесса разработки, коммуникации программистов и заказчиков. Есть опыт работы с зарубежными заказчиками (ОАЭ, Польша, Германия, Швейцария).
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.