Laravel Dispatch Intercept / Customize

时间:2018-01-21 19:12:47

标签: php laravel

我基本上想要这样做:Add custom field to Laravel queued job records?

然而,最高投票的答案并没有真正解决如何做到这一点,而是提倡解决方案。

我知道为了实际完成此操作,我需要使用dispatch功能。问题是它不能直接在我的(在这种情况下)事件监听器中调用。

根据thisthis 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是否是一个雄辩的模型。我需要能够在数据库驱动程序中保持一致的东西。

1 个答案:

答案 0 :(得分:0)

创建作业实例时,分配给公共属性的所有内容都会被序列化,然后在作业处理期间可供您使用。您可以将参数传递给作业构造函数,然后将它们分配给

等属性
public $foo;

public function __constructor($bar) {

    $this->foo = $bar;

}

然后在handle函数中,您可以从$this->foo

获取$ bar的值

编辑:如果在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,
    ];
}