如何通过数据注入来计划Laravel Job?

时间:2018-08-12 01:48:09

标签: laravel queue scheduled-tasks jobs

我一直在尝试更深入地了解Laravel的功能和自动化流程,并开始使用jobs/queues。我的问题是,我该如何运行依赖于应用程序数据的作业?我想做的是,如果一个函数返回true,则发出警报,但是我希望这是一个计划任务,而不是由路由或事件触发。将作业附加到queue:listenqueue:work的路由上时,我的工作正常,但是我想做的是创建一个计划任务,如下所示:

$schedule->job(new NotifyUsersOfData($data))->dailyAt('23:30');

但是,存在无法通过$data访问Kernel的问题,这是通过我的构造函数传递的:

NotifyUsersOfData

public function __construct($data)
{

    $this->data = $data;
}

public function handle()
{

    $users = ReturnAllUsers::invoke();
    foreach($users as $user) {
        sleep(1);
        $user->notify(new Alert($this->data));
    }

    return 'done';
}

我可以更改我的NotifyUsersOfData作业类的结构以便检索数据,但是在尝试安排作业时,这似乎仍然不起作用。我已经这样尝试过了:

NotifyUsersOfData

public function __construct()
{
    $data = Data::IsDataAvailable();

    if($data) {
        $this->data = $data;
    }
}

public function handle()
{

    $users = ReturnAllUsers::invoke();
    foreach($users as $user) {
        sleep(1);
        $user->notify(new Alert($this->data));
    }

    return 'done';
}

但这似乎不起作用。我的理解是jobs/queues允许我在应用程序的后台安排时间,例如通知用户依赖于某个功能的特定数据,但是我不知道该怎么做,我认为是一个有用的示例,可以正常工作。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

delay dispatching queued jobs有一个选项,在这种情况下,您可以创建一个新的分派时间的Carbon实例:

$dt = Carbon::create(now()->year, now()->month, now()->day, 23, 30, 0);

NotifyUsersOfData::dispatch($podcast)->delay($dt);

如果要在控制器中存储接收到的数据,则没有理由在以后运行作业时不进行查询:

public function handle()
{
    if (($data = Data::all()) && $data->isNotEmpty()) {
        User::all()->each(function (User $user) use ($data) {
            $user->notify(new Alert($data));
            usleep(1000000);
        });
    }
}