承接 maba/clock 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

maba/clock

最新稳定版本:0.1.1

Composer 安装命令:

composer require maba/clock

包简介

README 文档

README

What's that?

  1. ClockInterface with single method getCurrentDateTime (@returns \DateTime)

    Why not just new \DateTime()? Because sometimes you need to adjust the time. Depending on global context (read new \DateTime()) is just wrong, as you cannot change the behaviour by dependency injection, and thus configuration.

    Few examples: 1) unit tests - you need to mock the clock 2) you need to alter the timezone and you don't want to change php.ini settings (see TimeZonedClock)

  2. Classes in Condition namespace for checking and prioritizing time conditions.

Clock

RealTimeClock - gives the real, unaltered \DateTime

TimeZonedClock - gets time from another ClockInterface (usually RealTimeClock) and sets pre-configured timezone.

Condition

TimeCondition - POJO/Value object, which contains available time restrictions:

  1. From time, in seconds, inclusive
  2. Until time, in seconds, exclusive. Can overlap 00:00 with from time
  3. Weekday. 0 (Sunday) to 6 (Saturday)
  4. Day of month (1 to 31)
  5. Month (1 to 12). Can be specified only with day of month
  6. Year (for example 2015). Can be specified only with month and day of month

You can implement TimeConditionInterface and use this library with your own objects, for example any Doctrine Entity.

ConditionPriorityResolver - gives priority for any TimeConditionInterface. Larger priority means that condition is more concrete, thus should "win" if choosing between several.

TimeConditionChecker - returns whether given TimeConditionInterface matches given \DateTime

CurrentTimeConditionChecker - returns whether given TimeConditionInterface matches current time

ConditionalValueResolver - resolves most concrete time condition matching current time and gives related value.

Example:

<?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'),
));

Installing

composer require maba/clock

Running tests

Travis status Coverage Status

composer install
vendor/bin/phpunit

统计信息

  • 总下载量: 136
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 2
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2015-07-23