W jaki sposób mam napisać testy skoro nie mam w aplikacji nic oprócz rejestracji usera, no nic w takim razie pozostałe funkcje aplikacji będę pisał w podobny sposób czyli cała logika w kontrolerze
Zakładam, że wiążesz swoją przyszłość zawodową z tym właśnie frameworkiem dlatego od razu napiszę, robisz to źle - zarówno dla SIEBIE (uczysz się źle pisać) jak i dla osób, które będą oceniać Twój kod pod względem "czytelności" (piszę tutaj o potencjalnych rekruterach).
@Riddle: Nie za bardzo wiem co znaczy dla Ciebie "zaciemnianie" kodu używając UserService (chociaż sam stwierdziłeś, że autor "miał dobre intencje" :) ). Weź jednak pod uwagę to, że ten kod jest pisany w Laravel'u i pod takim właśnie kątem należałoby ten kod ocenić a nie pod 100% poprawnością SOLID (bo jak wszyscy tutaj się wcześniej zgodzili to 99% framworków nie jest zgodne z SOLID).
Fajnie napisałeś te trzy punkty odnośnie potrzeby SOLID.
Łatwość utrzymania - póki Laravel istnieje to łatwe to będzie na tyle łątwe, na ile jest dobrze napisane POD KĄTEM właśnie Laravel. Ja wiem, że istnieje "niezerowa" szansa, że Laravel pewnego dnia "wyparuje", zniknie czy trzeba będzie się przesiąść na coś innego i wówczas wszystkie helpery, wszystkie extends'y będą "bezużyteczne" i trzeba będzie pisać od nowa ale tak jak pisałem wcześniej, tutaj zasadę SOLID rozpatrywałbym w kontekście właśnie danego frameworka. (sam napisałeś również, że czasami nie da się przestrzegać tych wszystkich zasad).
Odporniejsze na zmiany - w tym przykładzie ciężko stwierdzić czy będzie ono odporne na zmiany (mamy JEDNĄ metodą tworzącą użytkownika i nic więcej) - no, chyba, że zmienimy framework.
Testy - już opisałeś :)
@phpowiec: Podsumowując jeszcze Twój kod:
Kopiuj
// $validated = $request->correctValidate(); - po co to jest?
// $validated['password'] = $user->hashPassword($validated['password']); - tak jak pisał jurek1980 - do UserService i jako prywatne
$user->createUser($request);
Kolejna rzecz odnośnie trzymania wszystkiego w kontrolerze - wyobraź sobie, że masz kilka typów użytkowników, ADMIN, USER, CUSTOMER.
Przykład 1 - wszyscy użytkownicy są tworzeni w ten sam sposób - ok, Twoja metoda się sprawdzi.
Przykład 2 - customer ma mieć dodatkowe pole takie jak "ważność konta" - i wtedy co robisz? Zgodnie z Twoim rozumowaniem to powinieneś napisać jakiegoś IF'a, który sprawdza, czy nowy użytkownik będzie customerem i dodawać to pole i to będzie bez sensu bo im więcej tych typów tym więcej zmian (i tych IF'ów)
I to taki pierwszy z brzegu przykład także moja rada - nie trzymaj całej logiki w kontrolerze - nic z tego dobrego nie wyjdzie.