我基本上想要这样做:Add custom field to Laravel queued job records?
然而,最高投票的答案并没有真正解决如何做到这一点,而是提倡解决方案。
我知道为了实际完成此操作,我需要使用dispatch
功能。问题是它不能直接在我的(在这种情况下)事件监听器中调用。
根据this和this dispatch
是一个全局帮助函数。源代码中的哪个位置已注册,如何在我的事件监听器中覆盖它,以便在指定的延迟后在handle()
类中运行Job
(调度自己调用的)并且能够添加其他条目/字段到数据库?
我的主要原因是:
1)。这项工作是通过电子邮件发送通知。
2)。如果用户在该延迟期间没有登录/处于活动状态,则电子邮件应该在延迟后退出。
3)。如果该用户自第一次发送电子邮件以来没有排队的其他电子邮件,则电子邮件应该会消失,在这种情况下,第一封邮件应该合并并删除到第二封电子邮件中。
因此,我需要额外的数据库字段来查找,删除和修改作业表中的条目。
这些想法来自an article on Medium,其中教导您不希望通过电子邮件/通知向用户发送垃圾邮件,并且您需要合并/分组/优先处理它们,并且我尝试在Laravel。
我相信在Laravel中这是可能的,但我不确定当dispatch
是全局的时候如何覆盖功能,我不知道从哪里调用它。 the Command Bus上的Laravel文档不会超越Laravel 5.0。
编辑:我现在必须使用Redis,因为我的队列中出现beginTransaction()
错误:
Redis Driver > Database Driver
我认为模型观察者最好,但我不确定Job
是否是一个雄辩的模型。我需要能够在数据库驱动程序中保持一致的东西。
答案 0 :(得分:0)
创建作业实例时,分配给公共属性的所有内容都会被序列化,然后在作业处理期间可供您使用。您可以将参数传递给作业构造函数,然后将它们分配给
等属性public $foo;
public function __constructor($bar) {
$this->foo = $bar;
}
然后在handle函数中,您可以从$this->foo
编辑:如果在DatabaseQueue
类中找到此方法。也许您可以覆盖以满足您的需求:
/**
* Create an array to insert for the given job.
*
* @param string|null $queue
* @param string $payload
* @param int $availableAt
* @param int $attempts
* @return array
*/
protected function buildDatabaseRecord($queue, $payload, $availableAt, $attempts = 0)
{
return [
'queue' => $queue,
'attempts' => $attempts,
'reserved_at' => null,
'available_at' => $availableAt,
'created_at' => $this->currentTime(),
'payload' => $payload,
];
}