2017-09-25 57 views
0

我想從代碼的其他部分安排工作。所以我創建了我自己的調度程序類,它將Illuminate\Console\Scheduling\Schedule::class注入爲構造函數參數。調度程序類用app(..::class)解決。在內核之外安排工作

一切工作正常,但在此實例上計劃的作業從未實際安排。

一個想法可能是將Illuminate\Console\Scheduling\Schedule註冊爲單身人士。

例:

class JobA extends Job 
{ 
    private $taskList; 

    public function __construct(TaskList $taskList) 
    { 
    $this->taskList = $taskList; 
    } 

    public function handle() 
    { 
    $this->taskList->run(); 
    } 
} 

class TaskList 
{ 
    private $tasks = [ 
    TaskA::class, 
    TaskB::class, 
    ... 
    ]; 

    public function run() 
    { 
    foreach($this->tasks as $task) { 
     // resolve $task and call it's own run method.. 
    } 
    } 

    public function addToSchedule(Schedule $schedule) 
    { 
    $scheduler->job(new JobA($this))->everyFiveMinutes(); 
    } 
} 

回答

2

Illuminate\Console\Scheduling\Schedule類已定義爲一個Singleton。有趣的是,當你說你的代碼的其他部分是時,你是指請求生命週期代碼還是控制檯代碼?兩者有不同的內核和不同的應用程序和調度是爲了Laravel的控制檯/ CLI部分的一部分

+0

我注意到,一些調試似乎所有的工作都添加,但沒有執行,我必須進一步調查。 –

+0

請記住,您的crontab執行'Illuminate \ Console \ Scheduling \ ScheduleRunCommand :: handle'方法。在執行此操作時,您的工作必須註冊 – Paras

+0

請參閱我添加的示例。我有TaskScheduler(獲取Schedule實例)解析TaskList類並調用傳遞Schedule實例的addToSchedule。 TaskList將它自己添加到計劃中。那麼計劃JobA每5分鐘運行一次。 JobA在收到的TaskList實例上調用run方法。 –