Ich versuche meine Datenbank mit einem externen Dienst zu synchronisieren.Laravel Multiple Model Events
Ich benutze Algolia Suche an ein paar Orten über eine Webanwendung.
Es ist mit ein paar Modellen indiziert, aber ich muss es neu indizieren, falls Änderungen an der Datenbank vorgenommen werden, d. H. Wenn mehrere Modellereignisse ausgelöst werden.
Mein erster Ansatz zum Handeln alles im Boot Methode des AppServiceProvider war
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();
});
}
}
Das ist mein Ansatz mehr conditionals Funktionen unter Verwendung der Standard-Modells in den docs exampled zu vermeiden.
Allerdings gehe ich davon aus, dass es einen besseren Weg gibt, Laravel Event Listeners zu verwenden.
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
Obwohl ich bin nicht sicher, wie in der in die Modell Ereignisse tippen hören Methode.
Ich habe so etwas für Benachrichtigungen getan, z. Ein Produkt wird aktualisiert, ein 'ProductCreatedEvent' wird ausgelöst. Ich bin damit einverstanden, weil ich es nur mit 'self :: updated()' in der Boot-Methode auslösen muss, wie Sie es anzeigen. Allerdings sollte etwas wie das erneute Indizieren hier ausgeführt werden, wann immer ein Modellereignis ausgelöst wird, und ich suchte nach einer Lösung, die nicht jedes Modellereignis mit nachfolgenden Ereignislistenern, Handlern usw. auflisten musste. Wenn ich mehr darüber in Betracht ziehe besser sein, einen Job zu erstellen und es im Boot zu versenden? Dann kann es zwar ShouldQueue implementieren, aber es wird immer ausgelöst. –
Wenn Sie jedes Model Event haben möchten, haben Sie wahrscheinlich mehr Glück, wenn Sie nach 'save' anstatt nach' created' Ausschau halten. Die 'ShouldQueue' beseitigt die Notwendigkeit, ein zusätzliches Job-Objekt zu definieren. Wenn Sie es nicht sofort ausführen möchten, würde ich vorschlagen, nur ein 'requests_search_indexing' Feld zu Ihrem Produktobjekt hinzuzufügen. Dann könnten Sie regelmäßig einen Cron-Job ausführen, um die Updates zu gruppieren. –
Das ist ein guter Punkt. Ich nehme es, wenn Sie einen Mittelweg wollten, befürworten Sie immer noch die Verwendung aller Event-Listener. Laravel 5.2 scheint Modellbeobachter aus den Dokumenten fallen gelassen zu haben, was mich dazu bringt, mich zu fragen, ob sie den Ansatz nicht mehr empfehlen. –