Twój kontroler wykonuje zbyt wiele pracy
Otwórz swój kontroler. Spójrz na swoją metodę store.
Czy ma 40 linii kodu? Czy zaczyna się od ogromnego bloku walidacji, po którym następuje kilka instrukcji if, potem logika biznesowa i na końcu return?
Twój kontroler wykonuje pracę, która nie należy do jego obowiązków.
Kontroler ma jedną prostą rolę. Odbiera żądanie, wywołuje usługę (service), aby rozwiązać problem, i zwraca odpowiedź. Pomyśl o nim jak o kelnerze. Kelner przynosi ci jedzenie. On go nie gotuje.
Kiedy umieszczasz walidację, autoryzację i przetwarzanie danych wewnątrz kontrolera, robi się bałagan. Kończysz z 80-liniowym potworem, którego nikt nie chce dotykać.
Laravel ma wbudowane rozwiązanie: Form Requests.
Przestań powtarzać logikę walidacji i autoryzacji w każdej metodzie. Korzystaj z zasady pojedynczej odpowiedzialności (Single Responsibility Principle). Klasa powinna mieć tylko jeden powód do zmiany. Kontroler zmienia się, gdy zmienia się przepływ żądań. Nie powinien się zmieniać tylko dlatego, że zmieniła się reguła walidacji.
Uruchom tę komendę, aby utworzyć dedykowaną klasę żądania:
php artisan make:request StorePostRequest
Przenieś swoją logikę do tej nowej klasy. Form Request obsługuje trzy główne rzeczy:
• Autoryzacja: Użyj metody authorize, aby zdecydować, czy użytkownik może wykonać daną akcję. Jeśli zwróci ona false, Laravel automatycznie wyśle błąd 403.
• Walidacja: Użyj metody rules, aby zdefiniować wymagania dotyczące danych.
• Przygotowanie danych: Użyj prepareForValidation, aby wyczyścić lub przekształcić dane przed uruchomieniem walidacji. Jest to idealne do generowania slugów lub normalizacji numerów telefonów.
Gdy przeniesiesz tę logikę, Twój kontroler się skurczy. Może wyglądać tak:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
To wszystko. Dwie linie.
Kontroler pozostaje lekki, ponieważ Laravel uruchamia walidację i autoryzację, zanim metoda w ogóle się rozpocznie. Jeśli dane są błędne, użytkownik natychmiast otrzyma błąd.
Słowo przestrogi. Nie używaj Form Requests do wszystkiego. Jeśli masz bardzo małą trasę (route) z jednym prostym polem, zachowaj walidację wewnątrz metody (inline). Używaj Form Requests, gdy logika rośnie, powtarza się lub obejmuje uprawnienia.
Nie umieszczaj również logiki biznesowej w Form Request. Obliczenia i aktualizacje bazy danych powinny znajdować się w warstwie usług (Service layer).
Znajdź dziś swój najbardziej zagmatwany kontroler. Wyciągnij walidację do Form Request. Patrz, jak się kurczy.
Jaka jest największa metoda store, jaką kiedykolwiek widziałeś? Daj znać w komentarzach.
Źródło: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
