Skip to content

Commit

Permalink
Extract frequency management methods of Event class into ManagesFrequ…
Browse files Browse the repository at this point in the history
…encies trait
  • Loading branch information
kstkn committed Mar 29, 2020
1 parent 41aef4a commit 220cd8d
Show file tree
Hide file tree
Showing 3 changed files with 508 additions and 279 deletions.
284 changes: 5 additions & 279 deletions src/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
*/
class Event extends Component
{
use ManagesFrequencies;

const EVENT_BEFORE_RUN = 'beforeRun';
const EVENT_AFTER_RUN = 'afterRun';

Expand Down Expand Up @@ -83,7 +85,7 @@ class Event extends Component
/**
* The mutex implementation.
*
* @var \yii\mutex\Mutex
* @var Mutex
*/
protected $_mutex;

Expand Down Expand Up @@ -112,6 +114,7 @@ public function __construct(Mutex $mutex, $command, $config = [])
/**
* Run the given event.
* @param Application $app
* @throws InvalidConfigException
*/
public function run(Application $app)
{
Expand All @@ -138,6 +141,7 @@ protected function mutexName()
* Run the command in the foreground.
*
* @param Application $app
* @throws InvalidConfigException
*/
protected function runCommandInForeground(Application $app)
{
Expand Down Expand Up @@ -222,284 +226,6 @@ protected function filtersPass(Application $app)
return true;
}

/**
* Schedule the event to run hourly.
*
* @return $this
*/
public function hourly()
{
return $this->cron('0 * * * * *');
}

/**
* The Cron expression representing the event's frequency.
*
* @param string $expression
* @return $this
*/
public function cron($expression)
{
$this->_expression = $expression;
return $this;
}

/**
* Schedule the event to run daily.
*
* @return $this
*/
public function daily()
{
return $this->cron('0 0 * * * *');
}

/**
* Schedule the command at a given time.
*
* @param string $time
* @return $this
*/
public function at($time)
{
return $this->dailyAt($time);
}

/**
* Schedule the event to run daily at a given time (10:00, 19:30, etc).
*
* @param string $time
* @return $this
*/
public function dailyAt($time)
{
$segments = explode(':', $time);
return $this->spliceIntoPosition(2, (int)$segments[0])
->spliceIntoPosition(1, count($segments) == 2 ? (int)$segments[1] : '0');
}

/**
* Splice the given value into the given position of the expression.
*
* @param int $position
* @param string $value
* @return Event
*/
protected function spliceIntoPosition($position, $value)
{
$segments = explode(' ', $this->_expression);
$segments[$position - 1] = $value;
return $this->cron(implode(' ', $segments));
}

/**
* Schedule the event to run twice daily.
*
* @return $this
*/
public function twiceDaily()
{
return $this->cron('0 1,13 * * * *');
}

/**
* Schedule the event to run only on weekdays.
*
* @return $this
*/
public function weekdays()
{
return $this->spliceIntoPosition(5, '1-5');
}

/**
* Schedule the event to run only on Mondays.
*
* @return $this
*/
public function mondays()
{
return $this->days(1);
}

/**
* Set the days of the week the command should run on.
*
* @param array|int $days
* @return $this
*/
public function days($days)
{
$days = is_array($days) ? $days : func_get_args();
return $this->spliceIntoPosition(5, implode(',', $days));
}

/**
* Schedule the event to run only on Tuesdays.
*
* @return $this
*/
public function tuesdays()
{
return $this->days(2);
}

/**
* Schedule the event to run only on Wednesdays.
*
* @return $this
*/
public function wednesdays()
{
return $this->days(3);
}

/**
* Schedule the event to run only on Thursdays.
*
* @return $this
*/
public function thursdays()
{
return $this->days(4);
}

/**
* Schedule the event to run only on Fridays.
*
* @return $this
*/
public function fridays()
{
return $this->days(5);
}

/**
* Schedule the event to run only on Saturdays.
*
* @return $this
*/
public function saturdays()
{
return $this->days(6);
}

/**
* Schedule the event to run only on Sundays.
*
* @return $this
*/
public function sundays()
{
return $this->days(0);
}

/**
* Schedule the event to run weekly.
*
* @return $this
*/
public function weekly()
{
return $this->cron('0 0 * * 0 *');
}

/**
* Schedule the event to run weekly on a given day and time.
*
* @param int $day
* @param string $time
* @return $this
*/
public function weeklyOn($day, $time = '0:0')
{
$this->dailyAt($time);
return $this->spliceIntoPosition(5, $day);
}

/**
* Schedule the event to run monthly.
*
* @return $this
*/
public function monthly()
{
return $this->cron('0 0 1 * * *');
}

/**
* Schedule the event to run yearly.
*
* @return $this
*/
public function yearly()
{
return $this->cron('0 0 1 1 * *');
}

/**
* Schedule the event to run every minute.
*
* @return $this
*/
public function everyMinute()
{
return $this->cron('* * * * * *');
}

/**
* Schedule the event to run every N minutes.
*
* @param int|string $minutes
* @return $this
*/
public function everyNMinutes($minutes)
{
return $this->cron('*/'.$minutes.' * * * * *');
}

/**
* Schedule the event to run every five minutes.
*
* @return $this
*/
public function everyFiveMinutes()
{
return $this->everyNMinutes(5);
}

/**
* Schedule the event to run every ten minutes.
*
* @return $this
*/
public function everyTenMinutes()
{
return $this->everyNMinutes(10);
}

/**
* Schedule the event to run every thirty minutes.
*
* @return $this
*/
public function everyThirtyMinutes()
{
return $this->cron('0,30 * * * * *');
}

/**
* Set the timezone the date should be evaluated on.
*
* @param \DateTimeZone|string $timezone
* @return $this
*/
public function timezone($timezone)
{
$this->_timezone = $timezone;
return $this;
}

/**
* Set which user the command should run as.
*
Expand Down
Loading

0 comments on commit 220cd8d

Please sign in to comment.