Sto tentando di sincronizzare il mio database con un servizio esterno.Eventi a più modelli di Laravel
Sto utilizzando la ricerca Algolia in un paio di posti in un'applicazione web.
È indicizzato con un paio di modelli, ma è necessario indicizzarlo nuovamente nel caso in cui vengano apportate modifiche al database, ad esempio quando vengono generati più eventi del modello.
Il mio primo approccio è stato quello di azione tutto all'interno del avvio metodo 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();
});
}
}
Questo è il mio approccio al fine di evitare più condizionali utilizzando le funzioni del modello standard exampled nel docs.
Tuttavia, suppongo che ci sia un modo migliore di utilizzare gli ascoltatori di eventi di Laravel.
namespace App\Listeners;
class OrderEventListener
{
// handlers
public function subscribe($events)
{
$events->listen(
// model events
);
}
}
Anche se io sono sicuro come sfruttare gli eventi del modello nel ascoltare metodo.
Ho fatto questo genere di cose per le notifiche, ad es. un prodotto viene aggiornato viene lanciato un 'ProductCreatedEvent'. Sto bene con questo perché ho bisogno solo di attivarlo con 'self :: updated()' nel metodo di avvio come si mostra. Tuttavia qualcosa come la reindicizzazione qui dovrebbe essere eseguito ogni volta che viene sparato un evento modello e stavo cercando una soluzione che non richiedesse di elencare ogni evento del modello con ascoltatori, gestori, ecc. Successivi essere migliore per creare un lavoro e inviarlo in avvio? Quindi può ancora implementare ShouldQueue ma verrà sempre attivato. –
Se vuoi che ogni evento del modello tu abbia più fortuna se guardi per 'saved' piuttosto che' created'. 'ShouldQueue' rimuove la necessità di definire un oggetto Job aggiuntivo. Se non vuoi eseguirlo istantaneamente suggerirei semplicemente di aggiungere un campo 'requires_search_indexing' al tuo oggetto prodotto. Quindi è possibile che un cron job esegua una scansione periodicamente, al fine di raggruppare gli aggiornamenti. –
Questo è un buon punto. Lo prendo se vuoi una via di mezzo che stai ancora sostenendo per l'utilizzo di tutti gli ascoltatori di eventi. Laravel 5.2 sembra aver abbandonato gli osservatori modello dai documenti, il che mi fa pensare se non stiano più raccomandando l'approccio. –