adlogix / php-event-scheduler
基于 Martin Fowlers 论文的 PHP 事件调度解决方案
Requires
- php: ^7.1
Requires (Dev)
- phpunit/phpunit: ~7.1
This package is auto-updated.
Last update: 2024-09-18 07:55:39 UTC
README
Adlogix 事件调度库提供了一种使用 Martin Fowler 的重复事件模式管理重复事件的方法。代码和文档的基础最初是从RiskioFr 的解决方案分叉的,并完全重构为更轻量级且依赖性更少!
需求
- PHP 7.1 或更高版本
文档
文档将帮助您了解如何使用和扩展 Schedule。
简介
Adlogix\EventScheduler\Scheduler
类表示的调度允许您知道是否在给定的日期发生任何事件。
用法
首先,您必须实例化 Adlogix\EventScheduler\Scheduler
并使用 Adlogix\EventScheduler\Scheduler::schedule
方法调度一些事件。
此示例使用 DayInMonth
时间表达式调度事件。因此,事件将在每月的 15 日发生。
use Adlogix\EventScheduler\Scheduler; use Adlogix\EventScheduler\TemporalExpression; $scheduler = new Scheduler(); $scheduledEvent = $scheduler->schedule(new BasicEvent('event_name'), new TemporalExpression\DayInMonth(15));
如果您想取消此事件,可以将返回的 Adlogix\EventScheduler\SchedulableEvent
实例提供给 Adlogix\EventScheduler\Scheduler::cancel
方法。
$scheduler->cancel($scheduledEvent);
时间表达式
时间表达式实现了 Adlogix\EventScheduler\TemporalExpression\TemporalExpressionInterface
,它提供了一个有用的 isOccurring
方法来检查事件是否在由 DateTimeInterface
实例表示的给定日期发生。
$temporalExpression = new TemporalExpression(); $isOccuring = $temporalExpression->isOccuring(new BasicEvent('event_name'), $date);
默认时间表达式
默认情况下,有一些时间表达式可以用来定义事件重复。
EachDay
- class: Adlogix\EventScheduler\TemporalExpression\EachDay
示例
use Adlogix\EventScheduler\TemporalExpression\EachDay; $expression = new EachDay();
DayInWeek
- class: Adlogix\EventScheduler\TemporalExpression\DayInWeek
- 参数: 天 (1-7)
示例
use Adlogix\EventScheduler\TemporalExpression\DayInWeek; use Adlogix\EventScheduler\ValueObject\WeekDay; $expression = new DayInWeek(WeekDay::MONDAY); $expression = DayInWeek::monday();
DayInMonth
- class: Adlogix\EventScheduler\TemporalExpression\DayInMonth
- 参数: 天 (1-31)
示例
use Adlogix\EventScheduler\TemporalExpression\DayInMonth; $expression = new DayInMonth(15);
WeekInYear
- class: Adlogix\EventScheduler\TemporalExpression\WeekInYear
- 参数: 月 (1-12)
示例
use Adlogix\EventScheduler\TemporalExpression\WeekInYear; use Adlogix\EventScheduler\ValueObject\Month; $expression = new WeekInYear(15);
MonthInYear
- class: Adlogix\EventScheduler\TemporalExpression\MonthInYear
- 参数: 月 (1-12)
示例
use Adlogix\EventScheduler\TemporalExpression\MonthInYear; use Adlogix\EventScheduler\ValueObject\Month; $expression = new MonthInYear(Month::JANUARY); $expression = MonthInYear::january();
学期
- class: Adlogix\EventScheduler\TemporalExpression\Semester
- 参数: 学期 (1-2)
示例
use Adlogix\EventScheduler\TemporalExpression\Semester; $expression = new Semester(1);
季度
- class: Adlogix\EventScheduler\TemporalExpression\Trimester
- 参数: 季度 (1-4)
示例
use Adlogix\EventScheduler\TemporalExpression\Trimester; $expression = new Trimester(1);
年
- class: Adlogix\EventScheduler\TemporalExpression\Year
- 参数: 年份
示例
use Adlogix\EventScheduler\TemporalExpression\Year; $expression = new Year(2015);
闰年
- class: Adlogix\EventScheduler\TemporalExpression\LeapYear
示例
use Adlogix\EventScheduler\TemporalExpression\LeapYear; $expression = new LeapYear();
From
- class: Adlogix\EventScheduler\TemporalExpression\From
- 参数:
DateTimeInterface
实例
示例
use DateTime; use Adlogix\EventScheduler\TemporalExpression\From; $date = new DateTime(); $expression = new From($date);
Until
- class: Adlogix\EventScheduler\TemporalExpression\Until
- 参数:
DateTimeInterface
实例
示例
use DateTime; use Adlogix\EventScheduler\TemporalExpression\Until; $date = new DateTime(); $expression = new Until($date);
RangeEachYear
- class: Adlogix\EventScheduler\TemporalExpression\RangeEachYear
- 参数
- 起始月份 (1-12)
- 结束月份 (1-12)
- 起始日 (1-31)
- 结束日 (1-31)
示例
use Adlogix\EventScheduler\TemporalExpression\RangeEachYear; // From January to March inclusive $expression = new RangeEachYear(1, 3); // From January 10 to March 20 $expression = new RangeEachYear(1, 3, 10, 20);
复合时间表达式
为了创建复杂的时间表达式,您可以使用复合时间表达式,允许构建先前表达式的组合。
交集
如果事件位于所有时间表达式中,则在给定日期发生。
示例
use DateTime; use Adlogix\EventScheduler\TemporalExpression\Collection\Intersection; use Adlogix\EventScheduler\TemporalExpression\DayInMonth; use Adlogix\EventScheduler\TemporalExpression\MonthInYear; $intersection = new Intersection(); $intersection->addElement(new DayInMonth(15)); $intersection->addElement(MonthInYear::january()); $intersection->isOccuring('event', new DateTime('2015-01-15')); // returns true $intersection->isOccuring('event', new DateTime('2015-01-16')); // returns false $intersection->isOccuring('event', new DateTime('2015-02-15')); // returns false
并集
如果事件至少位于一个时间表达式中,则在给定日期发生。
示例
use DateTime; use Adlogix\EventScheduler\TemporalExpression\Collection\Union; use Adlogix\EventScheduler\TemporalExpression\DayInMonth; use Adlogix\EventScheduler\TemporalExpression\MonthInYear; $union = new Union(); $intersection->addElement(new DayInMonth(15)); $intersection->addElement(MonthInYear::january()); $intersection->isOccuring('event', new DateTime('2015-01-15')); // returns true $intersection->isOccuring('event', new DateTime('2015-01-16')); // returns false $intersection->isOccuring('event', new DateTime('2015-02-15')); // returns true
差集
如果事件位于第一个时间表达式中但不在第二个时间表达式中,则在给定日期发生。
示例
use DateTime; use Adlogix\EventScheduler\TemporalExpression\DayInMonth; use Adlogix\EventScheduler\TemporalExpression\Difference; use Adlogix\EventScheduler\TemporalExpression\MonthInYear; $difference = new Difference(MonthInYear::january(), new DayInMonth(15)); $intersection->isOccuring('event', new DateTime('2015-01-15')); // returns false $intersection->isOccuring('event', new DateTime('2015-01-16')); // returns true $intersection->isOccuring('event', new DateTime('2015-02-15')); // returns false
自定义时间表达式
您可以通过实现 Adlogix\EventScheduler\TemporalExpression\TemporalExpressionInterface
创建满足您特殊需求的时间表达式。
食谱
在详细说明可用的不同时间表达式后,考虑一个具有复杂时间表达式的具体案例,该时间表达式可用于现实生活。
在下面的示例中,我们包括除了 7 月和 8 月之外的所有周六和周日。
use Adlogix\EventScheduler\TemporalExpression\Collection\Union; use Adlogix\EventScheduler\TemporalExpression\DayInWeek; use Adlogix\EventScheduler\TemporalExpression\Difference; use Adlogix\EventScheduler\TemporalExpression\MonthInYear; $includedWeekDays = new Union(); $union->addElement(DayInWeek::saturday()); $union->addElement(DayInWeek::sunday()); $excludedMonths = new Union(); $union->addElement(MonthInYear::july()); $union->addElement(MonthInYear::august()); $expression = new Difference($includedWeekDays, $excludedMonths);