adlogix/php-event-scheduler

基于 Martin Fowlers 论文的 PHP 事件调度解决方案

dev-master 2018-05-24 13:57 UTC

This package is auto-updated.

Last update: 2024-09-18 07:55:39 UTC


README

Adlogix 事件调度库提供了一种使用 Martin Fowler 的重复事件模式管理重复事件的方法。代码和文档的基础最初是从RiskioFr 的解决方案分叉的,并完全重构为更轻量级且依赖性更少!

Build Status Scrutinizer Code Quality Code Coverage Latest Stable Version Total Downloads Latest Unstable Version License

需求

  • 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);