Diciamo che ogni volta che eseguo un'operazione CRUD o modifico una relazione in un modo specifico, voglio fare anche qualcos'altro. Ad esempio, ogni volta che qualcuno pubblica un post, voglio anche salvare qualcosa in una tabella per l'analisi. Forse non è il miglior esempio, ma in generale c'è molta di questa funzionalità "raggruppata".
Normalmente vedo questo tipo di logica nei controller. Va tutto bene fino a quando non vuoi riprodurre questa funzionalità in molti posti. Quando inizi a entrare nei parziali, creando un'API e generando contenuti fittizi, diventa un problema mantenere le cose ASCIUTTE.
I modi che ho visto per gestirlo sono eventi, repository, librerie e aggiunta ai modelli. Ecco la mia comprensione di ciascuno:
Servizi: è qui che la maggior parte delle persone probabilmente inserisce questo codice. Il mio problema principale con i servizi è che a volte è difficile trovare funzionalità specifiche in loro e mi sento come se si dimenticassero quando le persone si concentrano sull'uso di Eloquent. Come faccio a sapere che devo chiamare un metodo publishPost()
in una libreria quando posso semplicemente fare $post->is_published = 1
?
L'unica condizione in cui vedo che funziona bene è se usi SOLO i servizi (e idealmente rendi Eloquent inaccessibile in qualche modo dai controller tutti insieme).
Alla fine sembra che questo creerebbe solo un mucchio di file extra non necessari se le tue richieste seguono generalmente la struttura del tuo modello.
Repository: da quello che ho capito, questo è fondamentalmente come un servizio, ma c'è un'interfaccia in modo da poter passare da un ORM al quale non ho bisogno.
Eventi: lo vedo come il sistema più elegante in un certo senso perché sai che i tuoi eventi modello saranno sempre chiamati su metodi Eloquent, quindi puoi scrivere i tuoi controller come faresti normalmente. Riesco a vederli diventare disordinati però e se qualcuno ha esempi di grandi progetti che utilizzano eventi per l'accoppiamento critico mi piacerebbe vederlo.
Modelli: tradizionalmente avrei classi che eseguivano CRUD e gestivano anche l'accoppiamento critico. Questo in realtà ha reso le cose facili perché sapevi che tutte le funzionalità di CRUD + erano presenti lì.
Semplice, ma nell'architettura MVC questo non è normalmente quello che vedo fatto. In un certo senso preferisco questo rispetto ai servizi poiché è un po 'più facile da trovare e ci sono meno file di cui tenere traccia. Può essere un po 'disorganizzato però. Mi piacerebbe sentire i fallimenti di questo metodo e perché la maggior parte delle persone non sembra farlo.
Quali sono i vantaggi / gli svantaggi di ciascun metodo? Mi sto perdendo qualcosa?