Powiedzmy, że ilekroć wykonuję operację CRUD lub modyfikuję relację w określony sposób, chcę też zrobić coś innego. Np. Za każdym razem, gdy ktoś publikuje post, chcę również zapisać coś w tabeli do celów analitycznych. Może nie jest to najlepszy przykład, ale generalnie istnieje wiele funkcji „pogrupowanych”.
Zwykle widzę tego typu logikę umieszczoną w kontrolerach. To wszystko w porządku, dopóki nie zechcesz odtworzyć tej funkcji w wielu miejscach. Kiedy zaczynasz wchodzić w częściowe, tworzenie API i generowanie fikcyjnej zawartości, staje się problemem z utrzymaniem rzeczy SUCHYCH.
Sposoby radzenia sobie z tym to zdarzenia, repozytoria, biblioteki i dodawanie do modeli. Oto moje rozumienie każdego z nich:
Usługi: tutaj większość ludzi prawdopodobnie umieściłaby ten kod. Moim głównym problemem związanym z usługami jest to, że czasami trudno jest znaleźć w nich określoną funkcjonalność i czuję, że zapomina się o nich, gdy ludzie koncentrują się na używaniu Eloquent. Skąd mam wiedzieć, że muszę wywołać metodę publishPost()
w bibliotece, skoro mogę to zrobić $post->is_published = 1
?
Jedynym warunkiem, w jakim to działa dobrze, jest to, że używasz TYLKO usług (i idealnie sprawisz, że Eloquent będzie w jakiś sposób niedostępny dla wszystkich kontrolerów).
Ostatecznie wygląda na to, że utworzyłoby to kilka dodatkowych niepotrzebnych plików, jeśli Twoje żądania generalnie są zgodne ze strukturą modelu.
Repozytoria: z tego, co rozumiem, jest to w zasadzie jak usługa, ale istnieje interfejs, dzięki czemu można przełączać się między ORMami, których nie potrzebuję.
Zdarzenia: uważam to za najbardziej elegancki system w pewnym sensie, ponieważ wiesz, że zdarzenia modelowe zawsze będą wywoływane metodami elokwentnymi, więc możesz pisać kontrolery tak, jak zwykle. Widzę jednak, że robi się bałagan i jeśli ktoś ma przykłady dużych projektów wykorzystujących zdarzenia do krytycznego sprzężenia, chciałbym to zobaczyć.
Modele: Tradycyjnie miałbym klasy, które wykonywały CRUD, a także obsługiwały krytyczne sprzężenia. To faktycznie ułatwiło sprawę, ponieważ znałeś wszystkie funkcje związane z CRUD +, cokolwiek trzeba było z tym zrobić, było tam.
Proste, ale w architekturze MVC zwykle nie jest to to, co widzę. W pewnym sensie wolę to od usług, ponieważ jest trochę łatwiejsze do znalezienia i jest mniej plików do śledzenia. Może się jednak trochę zdezorganizować. Chciałbym usłyszeć wady tej metody i dlaczego większość ludzi tego nie robi.
Jakie są zalety / wady każdej metody? Czy coś mi brakuje?