首先,如果你只需要缺失的
weekends()方法,你可以在事件上调用
days(6,7)来实现。
如果你需要为调度程序添加更多逻辑,请继续阅读。
我看了一下代码,虽然Laravel没有提供一种扩展
Scheduler及其预定
Events的方法,但仍然可以从你的
Kernel::schedule()应用附加约束。
根据你的需求,有两种方法可以实现。
If you want to set some custom CRON expression for an event, you can simply use its cron() method:
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
})->cron('0 1 2 * * *')->daily();
}
If you need to apply some CRON constraints using existing methods, but need to modify it later the way weekdays() does using spliceIntoPosition, you can access it by calling getExpression(), modify it, and then set using cron().
protected function schedule(Schedule $schedule)
{
$event = $schedule->call(function () {
//scheduled code
});
$scheduledAt = $event->getExpression(); //get cron expression
...; //modify the $scheduledAt expression
$event->cron($scheduledAt); // set the new schedule for that even
}
如果您想要为多个事件重复使用逻辑,可以在您的 Kernel.php 中添加帮助函数,例如:
protected function specialSchedule(\Illuminate\Console\Scheduling\Event $event) {
$scheduledAt = $event->getExpression();
...; // modify $scheduledAt expression
$event->cron($scheduledAt);
return $event;
}
那么在定义计划时,您可以重复使用该逻辑:
protected function schedule(Schedule $schedule)
{
$this->specialSchedule($schedule->call(function () {
}));
}
更新:
还有一种更加复杂但也更加灵活的方法可以实现此功能,需要你提供自己的Schedule和Event类。
首先,实现你自己的Event类,并添加以下新方法:
class CustomEvent extends \Illuminate\Console\Scheduling\CallbackEvent {
public function weekends() {
return $this->days(6,7);
}
}
接下来是您自己的Schedule类,使其创建CustomEvent对象:
class CustomSchedule extends \Illuminate\Console\Scheduling\Schedule
{
public function call($callback, array $parameters = [])
{
$this->events[] = $event = new CustomEvent($callback, $parameters);
return $event;
}
public function exec($command, array $parameters = [])
{
if (count($parameters)) {
$command .= ' '.$this->compileParameters($parameters);
}
$this->events[] = $event = new Event($command);
return $event;
}
}
最后,在您的Kernel.php中,您需要确保使用您的新调度类进行调度:
protected function defineConsoleSchedule()
{
$this->app->instance(
'Illuminate\Console\Scheduling\Schedule', $schedule = new Schedule
);
$this->schedule($schedule);
}