Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract frequency management methods of Event into trait #59

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
286 changes: 6 additions & 280 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 All @@ -31,7 +33,7 @@ class Event extends Component
*
* @var string
*/
protected $_expression = '* * * * * *';
protected $_expression = '* * * * *';
/**
* The timezone the date should be evaluated on.
*
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