데이터베이스를 외부 서비스와 동기화하려고합니다.Laravel 다중 모델 이벤트
웹 응용 프로그램의 몇 곳에서 알골시아 검색을 사용하고 있습니다.
두 개의 모델로 색인이 생성되었지만 데이터베이스에 변경 사항이 발생하는 경우 (즉, 여러 모델 이벤트가 발생하는 경우) 색인을 다시 생성해야합니다.
내 첫 번째 방법은 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();
});
}
}
의 부팅 메서드 내에서 행동 모든 것을했다 이것을 docs에 exampled 표준 모델 기능을 사용하여 여러 조건문을 피하기 위해 내 접근 방식입니다.
그러나 Laravel Event Listeners를 사용하는 것이 더 좋은 방법이라고 가정합니다.
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
나는 의 모델 이벤트를 활용하는 방법을 확실 해요하지만
는 방법을들을 수 있습니다.
나는 이런 종류의 통지를했습니다. 제품이 업데이트되고 'ProductCreatedEvent'가 시작됩니다. 내가보기에는 부트 메소드에서'self :: updated()'로만 트리거 할 필요가 있기 때문에 괜찮습니다. 그러나 모델 이벤트가 발생할 때마다 여기에서 다시 색인을 생성하는 것과 같은 작업을 수행해야하며 이후 이벤트 리스너, 핸들러 등에서 모든 모델 이벤트를 나열 할 필요가없는 솔루션을 찾고있었습니다. 더 자세히 살펴보면 일자리를 만들고 부츠를 파견하는 것이 더 낫지 않습니까? 그럼 여전히 ShouldQueue 구현할 수 있지만 항상 화재 것입니다. –
모든 모델 이벤트를 원한다면'created'보다는'saved'를 보시면 아마 더 많은 행운을 빕니다. ShouldQueue는 추가되는 Job 객체가 정의 될 필요가 없게한다. 즉각적으로 실행하고 싶지 않다면 제품 오브젝트에'requires_search_indexing' 필드를 추가하는 것이 좋습니다. 그런 다음 업데이트를 그룹화하기 위해 정기적으로 스윕 작업을 할 수 있습니다. –
좋은 지적입니다. 나는 당신이 여전히 모든 이벤트 리스너를 사용하는 것을 주장하고있는 중도를 원한다면 받아들입니다. Laravel 5.2는 모델 관측자를 문서에서 제외 시켰기 때문에 더 이상 접근법을 추천하지 않는지 의심 스럽습니다. –