Luk*_*ent 10 php laravel laravel-5 algolia laravel-5.2
我正在尝试将我的数据库与外部服务同步.
我正在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();
});
}
}
Run Code Online (Sandbox Code Playgroud)
这是我使用文档中示例的标准模型函数来避免多个条件的方法.
但是我假设使用Laravel事件监听器有更好的方法.
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我不确定如何在listen方法中使用模型事件.
我强烈建议为这种情况添加自己的事件和处理程序.
在您的Product
和Order
类中,您可以覆盖boot
模型的方法:
class Product extends Model
{
protected static function boot()
{
parent::boot();
self::created(function($product) {
event(new ProductCreatedEvent($product));
});
}
}
Run Code Online (Sandbox Code Playgroud)
您需要创建自己的ProductCreatedEvent
对象.现在EventServiceProvider
你将要添加到监听器数组;
protected $listeners = [
'App\Events\ProductCreatedEvent' => [
'App\Listeners\UpdateAlgoliaProductIndex',
]
];
Run Code Online (Sandbox Code Playgroud)
一旦你设置了它,你就可以实际运行php artisan event:generate
,这将为你创建事件对象和监听器.我将跳过事件对象,因为它非常简单,只需要创建产品并将其发送给UpdateAlgoliaProductIndex
监听器.
现在,在您的听众中,您将拥有以下内容:
class UpdateAlgoliaProductIndex
{
public function handle($event)
{
Product::reindex();
Product::setSettings();
}
}
Run Code Online (Sandbox Code Playgroud)
我建议这种方法的原因是您可以使用ShouldQueue
界面对侦听器进行排队,这意味着您在等待应用程序重新索引Algolia时不会阻止请求,从而为您的用户带来更好的体验.
您可以在此处阅读有关事件对象和侦听器的更多信息.
另一种选择是使用模型观察者.
归档时间: |
|
查看次数: |
1972 次 |
最近记录: |