我正在尝试将我的数据库与外部服务同步。
我在跨web应用程序的几个地方使用Algolia搜索。
它是用几个模型建立索引的,但是,我需要它在数据库发生任何更改时重新索引,即当触发多个模型事件时。
我的第一种方法是在AppServiceProvider的引导方法中执行所有操作。
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方法中的模型事件。
发布于 2016-06-06 21:30:34
我强烈建议为这种情况添加您自己的事件和处理程序。
在Product和Order类中,您可以重写模型的boot方法:
class Product extends Model
{
protected static function boot()
{
parent::boot();
self::created(function($product) {
event(new ProductCreatedEvent($product));
});
}
}您需要创建自己的ProductCreatedEvent对象。现在,在EventServiceProvider中,您需要添加到侦听器数组中;
protected $listeners = [
'App\Events\ProductCreatedEvent' => [
'App\Listeners\UpdateAlgoliaProductIndex',
]
];设置好之后,您可以实际运行php artisan event:generate,这将为您创建事件对象和侦听器。我将跳过事件对象,因为它非常简单,它只接受所创建的产品并将其发送到UpdateAlgoliaProductIndex侦听器。
现在,在您的侦听器中,您将得到如下内容:
class UpdateAlgoliaProductIndex
{
public function handle($event)
{
Product::reindex();
Product::setSettings();
}
}我建议采用这种方法的原因是,您可以使用ShouldQueue接口对侦听器进行排队,这意味着您不会在等待应用程序使用Algolia重新索引时阻止请求,从而为用户带来更好的体验。
您可以阅读更多关于事件对象和侦听器这里的信息。
另一种选择是使用模型观测器。
发布于 2016-06-09 10:30:16
通过一些挖掘,我遇到了Laravel 订户,它更类似于我正在寻找的东西,所以我提交了它作为自己的答案。
我认为这会产生比每个事件都有侦听器更简洁的代码。
namespace App\Listeners;
use App\Events\OrderCreatedEvent;
use App\Events\OrderUpdatedEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class OrderEventListener
{
/**
* Handle order created events.
*
* @param OrderCreatedEvent $event
*/
public function onOrderCreation(OrderCreatedEvent $event)
{
// do something
}
/**
* Handle order updated events.
*
* @param OrderUpdatedEvent $event
*/
public function onOrderUpdate(OrderUpdatedEvent $event)
{
// do something
}
/**
* Register the listeners for the subscriber.
*
* @param $events
*/
public function subscribe($events)
{
$events->listen(
'App\Events\OrderCreatedEvent',
'App\Listeners\OrderEventListener@onOrderCreation'
);
$events->listen(
'App\Events\OrderUpdatedEvent',
'App\Listeners\OrderEventListener@onOrderUpdate'
);
}
}我将保持marcus.ramsden答案的标记,但这可能与遇到这个问题的人非常相关。
https://stackoverflow.com/questions/37612058
复制相似问题