You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.4 KiB
52 lines
1.4 KiB
<?php |
|
|
|
declare(strict_types=1); |
|
|
|
namespace Cron; |
|
|
|
use InvalidArgumentException; |
|
|
|
/** |
|
* CRON field factory implementing a flyweight factory. |
|
* |
|
* @see http://en.wikipedia.org/wiki/Cron |
|
*/ |
|
class FieldFactory implements FieldFactoryInterface |
|
{ |
|
/** |
|
* @var array Cache of instantiated fields |
|
*/ |
|
private $fields = []; |
|
|
|
/** |
|
* Get an instance of a field object for a cron expression position. |
|
* |
|
* @param int $position CRON expression position value to retrieve |
|
* |
|
* @throws InvalidArgumentException if a position is not valid |
|
*/ |
|
public function getField(int $position): FieldInterface |
|
{ |
|
return $this->fields[$position] ?? $this->fields[$position] = $this->instantiateField($position); |
|
} |
|
|
|
private function instantiateField(int $position): FieldInterface |
|
{ |
|
switch ($position) { |
|
case CronExpression::MINUTE: |
|
return new MinutesField(); |
|
case CronExpression::HOUR: |
|
return new HoursField(); |
|
case CronExpression::DAY: |
|
return new DayOfMonthField(); |
|
case CronExpression::MONTH: |
|
return new MonthField(); |
|
case CronExpression::WEEKDAY: |
|
return new DayOfWeekField(); |
|
} |
|
|
|
throw new InvalidArgumentException( |
|
($position + 1) . ' is not a valid position' |
|
); |
|
} |
|
}
|
|
|