我正在尝试将我的数据库与一个外部服务同步。
我在 Web 应用程序的几个地方使用 Algolia 搜索。
它已经被几个模型索引,但是如果数据库发生任何更改,例如当多个模型事件被触发时,我需要重新索引它。
我的第一种方法是在 AppServiceProvider 的 boot 方法中执行所有操作。
public function boot()
{
$events = ['created', 'updated', 'deleted', 'restored'];
// reindex handlers for models relevant to Algolia search
foreach ($events as $evt) {
Order::registerModelEvent($evt, function () {
Order::reindex();
});
Product::registerModelEvent($evt, function () {
Product::reindex();
Product::setSettings();
});
}
}
这是我采用标准模型功能避免多条件语句的方法,示例在文档中。
但是我认为使用Laravel事件监听器可能有更好的方法。
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
虽然我不确定如何在listen方法中获取模型事件。
ProductCreatedEvent
。我对此感到满意,因为我只需要在引导方法中使用self::updated()
来触发它,就像你展示的那样。 然而,像重新索引这样的操作应该在任何模型事件触发时执行,我正在寻找一种不需要列出每个模型事件及其后续事件侦听器、处理程序等的解决方案。更深入地研究后,创建一个作业并在引导时调度它是否不是更好的选择?然后它仍然可以实现ShouldQueue,但它将始终触发。 - Luke Vincentsaved
而不是created
。ShouldQueue
可以消除需要定义额外 Job 对象的需求。如果你不想立即运行它,我建议只需在你的产品对象中添加一个requires_search_indexing
字段。然后你可以定期使用 cron job 进行扫描,以便将更新分组。 - marcus.ramsden