maba / clock
Requires
- php: >=5.3.2
Requires (Dev)
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: ^0.6.1
This package is auto-updated.
Last update: 2024-09-10 20:07:30 UTC
README
这是什么?
-
ClockInterface
包含单个方法getCurrentDateTime
(@returns \DateTime
)为什么不是直接使用
new \DateTime()
? 因为有时候你需要调整时间。依赖于全局上下文(即new \DateTime()
)是错误的,因为你不能通过依赖注入来改变其行为,因此配置。一些示例:1) 单元测试 - 你需要模拟时钟 2) 你需要更改时区,但又不想更改 php.ini 设置(参见
TimeZonedClock
) -
在
Condition
命名空间中的类用于检查和优先级排序时间条件。
时钟
RealTimeClock
- 提供真实、未修改的 \DateTime
TimeZonedClock
- 从另一个 ClockInterface
(通常是 RealTimeClock
)获取时间,并设置预先配置的时区。
条件
TimeCondition
- POJO/值对象,包含可用的时限制约
- 从时间,以秒为单位,包含
- 直到时间,以秒为单位,不包含。可以与从时间重叠 00:00
- 星期几。
0
(星期日)到6
(星期六) - 月份中的某一天(
1
到31
) - 月份(
1
到12
)。只能与月份中的某一天一起指定 - 年份(例如
2015
)。只能与月份和月份中的某一天一起指定
你可以实现 TimeConditionInterface
并使用此库与自己的对象一起使用,例如任何 Doctrine 实体。
ConditionPriorityResolver
- 为任何 TimeConditionInterface
提供优先级。更高的优先级意味着条件更加具体,因此在选择多个条件时应该“获胜”。
TimeConditionChecker
- 返回给定的 TimeConditionInterface
是否与给定的 \DateTime
匹配
CurrentTimeConditionChecker
- 返回给定的 TimeConditionInterface
是否与当前时间匹配
ConditionalValueResolver
- 解析与当前时间最具体的时间条件并给出相关值。
示例
<?php $resolver = new ConditionalValueResolver( new ConditionPriorityResolver(), new CurrentTimeConditionChecker(new RealTimeClock(), new TimeConditionChecker()) ); // order of the items in the array does not matter, as they're ordered by priorities $resolver->resolveValue(array( // default price 20 EUR (new ConditionalValue())->setTimeCondition( (new TimeCondition()) )->setValue('20 EUR'), // from 16:00 price is 30 EUR (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setFromTime(16 * 3600) )->setValue('30 EUR'), // 17:00 - 18:00 we have a happy hour (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setFromTime(17 * 3600)->setUntilTime(18 * 3600) )->setValue('15 EUR'), // 23:00 - 03:00 price is bigger (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setFromTime(23 * 3600)->setUntilTime(03 * 3600) )->setValue('40 EUR'), // price is 50 EUR on Sundays. This wins over all above rules (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setWeekday(0) )->setValue('50 EUR'), // this overwrites price from 20:00 until 00:00 (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setWeekday(0)->setFromTime(20 * 3600) )->setValue('30 EUR'), // first day on every month - cheap one. Wins over all above (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setDay(1) )->setValue('10 EUR'), // day of New Year is special (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setDay(1)->setMonth(1) )->setValue('100 EUR'), // Easter etc. (new ConditionalValue())->setTimeCondition( (new TimeCondition())->setDay(5)->setMonth(4)->setYear(2015) )->setValue('50 EUR'), ));
安装
composer require maba/clock
运行测试
composer install
vendor/bin/phpunit