На початку нового року багато з нас ставлять собі повторювані цілі: щоденні тренування, щотижневі наради або щомісячні рефлексії. Відстежувати ці зобов'язання може бути складно, але керувати ними програмно зовсім не обов'язково. Знайомтеся з Recurr – потужною PHP-бібліотекою, створеною Шоном Сіммонсом, яка спрощує роботу з правилами повторювання (RRULE). Незалежно від того, чи плануєте ви щотижневі нагадування, щомісячні події чи щось інше, Recurr спростить управління повторюваними датами, що дозволить вам зосередитися на розробці вашого додатку.
Щоб встановити Recurr, використайте Composer:
composer require simshaun/recurr
Далі, у вашому PHP-коді, ви можете створити екземпляр класу \Recurr\Rule
:
$timezone = 'America/Jamaica';
$startDate = new \DateTime('2025-01-01 10:00:00', new \DateTimeZone($timezone));
$endDate = new \DateTime('2025-02-12 10:00:00', new \DateTimeZone($timezone)); // Необов'язково
$rule = new \Recurr\Rule('FREQ=WEEKLY;COUNT=6', $startDate, $endDate, $timezone);
echo $rule->getString();
// вивід: FREQ=WEEKLY;COUNT=6;DTEND=20250212T100000
Ви також можете записати це, комбінуючи методи для кращої читабельності:
$rule = (new \Recurr\Rule)
->setStartDate($startDate)
->setTimezone($timezone)
->setFreq('WEEKLY')
->setCount(6)
->setUntil($endDate);
Після створення правила повторення ви можете перетворити його в зрозумілий текст:
$transformer = new \Recurr\Transformer\TextTransformer();
echo $transformer->transform($rule);
// вивід: щотижня у середу, 6 разів
Якщо вам потрібно отримати реальні об'єкти DateTime, які представляють дати повторення, скористайтеся класом ArrayTransformer
разом із методами getStart()
або getEnd()
:
$transformer = new \Recurr\Transformer\ArrayTransformer();
$dates = $transformer->transform($rule);
foreach ($dates as $date) {
echo $date->getStart()->format('Y-m-d H:i:s') . PHP_EOL;
}
/*
вивід:
2025-01-01 10:00:00
2025-01-08 10:00:00
2025-01-15 10:00:00
2025-01-22 10:00:00
2025-01-29 10:00:00
2025-02-05 10:00:00
2025-02-12 10:00:00
*/
Також можна вказати дні тижня для повторення, використавши метод setByDay()
:
$rule = (new \Recurr\Rule)
->setStartDate($startDate)
->setTimezone($timezone)
->setFreq('WEEKLY')
->setByDay(['WE', 'FR'])
->setCount(6)
->setUntil($endDate);
$transformer = new \Recurr\Transformer\TextTransformer();
echo $transformer->transform($rule) . PHP_EOL;
// вивід: щотижня у середу та п’ятницю до 12 лютого 2025 року
Recurr також пропонує просунуті можливості, такі як встановлення обмежень для включення чи виключення конкретних дат, застосування фільтрів після трансформації та визначення власних інтервалів.
Щоб дізнатися більше про цю бібліотеку та її можливості, відвідайте репозиторій на GitHub.