我一直在尝试更深入地了解Laravel的功能和自动化流程,并开始使用jobs/queues
。我的问题是,我该如何运行依赖于应用程序数据的作业?我想做的是,如果一个函数返回true,则发出警报,但是我希望这是一个计划任务,而不是由路由或事件触发。将作业附加到queue:listen
或queue: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
允许我在应用程序的后台安排时间,例如通知用户依赖于某个功能的特定数据,但是我不知道该怎么做,我认为是一个有用的示例,可以正常工作。
我该怎么做?
答案 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);
});
}
}