首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel 5调度程序中添加自定义方法

在Laravel 5调度程序中添加自定义方法
EN

Stack Overflow用户
提问于 2015-07-23 22:48:26
回答 2查看 2.2K关注 0票数 3

我想知道将周末这样的事情添加到可用的时间表约束中的最佳方法是什么:

代码语言:javascript
复制
Illuminate\Console\Scheduling\Event.php
public function weekdays()
{
    return $this->spliceIntoPosition(5, '1-5');
}

及其逻辑上的相反:

代码语言:javascript
复制
public function weekends()
{
        return $this->days(array( '0','6'));
}

我将把这些内容包括在哪里,这样它们就不会被框架更新覆盖?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-23 23:30:36

首先,如果您所缺少的是()方法,则可以通过在事件上调用days(6,7)来实现这一点。

如果您需要向调度程序添加更多的逻辑,请继续阅读。

我看了一下代码,虽然Laravel没有提供用其他方法扩展Scheduler,特别是其计划的Events的方法,但是仍然可以从您的中应用额外的约束

根据您的需要,有两种方法可以做到这一点。

  1. 如果您想为事件设置一些自定义的CRON表达式,只需使用它的cron()方法: 受保护的函数调度(调度$schedule) {$schedule->调用(函数() {//调度代码})->cron(‘01.2** *')->daily();}
  2. 如果您需要使用现有的方法应用一些CRON约束,但是以后需要像spliceIntoPosition,一样修改它,您可以调用getExpression(),修改它,然后使用cron()进行设置。 受保护的函数调度(调度$schedule) { $event =$ schedule ->$event(函数() { //调度代码});$scheduledAt = $event->getExpression();//get cron表达式.;//修改$scheduledAt表达式$event->cron($scheduledAt);//为该偶数}设置新的调度

如果要对多个事件重用逻辑,可以在Kernel.php中添加助手函数,例如:

代码语言:javascript
复制
    protected function specialSchedule(\Illuminate\Console\Scheduling\Event $event) {
      $scheduledAt = $event->getExpression();

      ...; // modify $scheduledAt expression

      $event->cron($scheduledAt);

      return $event;
    }

然后,您可以在定义计划时重用该逻辑:

代码语言:javascript
复制
    protected function schedule(Schedule $schedule)
    {
        $this->specialSchedule($schedule->call(function () {
            //scheduled code
        }));
    }

更新:

还有一种方法--更复杂一点,因为它要求您提供自己的时间表和事件类,但也需要更灵活。

首先,实现您自己的事件类,并在那里添加新方法:

代码语言:javascript
复制
    class CustomEvent extends \Illuminate\Console\Scheduling\CallbackEvent {
      public function weekends() {
        return $this->days(6,7);
      }
    }

然后是您自己的调度类,以便创建CustomEvent对象:

代码语言:javascript
复制
    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中,您还需要确保您的新调度类用于调度:

代码语言:javascript
复制
    protected function defineConsoleSchedule()
    {
      $this->app->instance(
        'Illuminate\Console\Scheduling\Schedule', $schedule = new Schedule
      );

      $this->schedule($schedule);
    }
票数 3
EN

Stack Overflow用户

发布于 2020-05-21 16:58:26

折叠@jedrzej.kurylo的回答,我是在laravel 5.8上这样做的:

php artisan make:model CustomCallbackEvent

php artisan make:model CustomEvent

php artisan make:model CustomSchedule

在CustomCallbackEvent中:

代码语言:javascript
复制
use Illuminate\Console\Scheduling\CallbackEvent;
use Illuminate\Console\Scheduling\EventMutex;

class CustomCallbackEvent extends CallbackEvent
{
    public function __construct(EventMutex $mutex, $callback, array $parameters = [])
    {
        parent::__construct($mutex, $callback, $parameters);
    }
}

在CustomSchedule中:

代码语言:javascript
复制
use Illuminate\Console\Scheduling\Schedule;

class CustomSchedule extends Schedule
{
    public function call($callback, array $parameters = [])
    {
        $this->events[] = $event = new CustomCallbackEvent(
            $this->eventMutex,
            $callback,
            $parameters
        );

        return $event;
    }

    public function exec($command, array $parameters = [])
    {
        if (count($parameters)) {
            $command .= ' '.$this->compileParameters($parameters);
        }

        $this->events[] = $event = new CustomEvent($this->eventMutex, $command, $this->timezone);

        return $event;
    }
}

在CustomEvent中:

代码语言:javascript
复制
use Illuminate\Console\Scheduling\Event;

class CustomEvent extends Event
{
    public function myFunction()
    {
        //your logic here
    }
}

在Kernel.php中:

代码语言:javascript
复制
protected function defineConsoleSchedule()
    {
      $this->app->instance(
        'Illuminate\Console\Scheduling\Schedule', $schedule = new CustomSchedule
      );

      $this->schedule($schedule);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31599351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档