Ваш контролер виконує не ту роботу

Відкрийте свій контролер. Знайдіть метод store.

Чи має він 40 рядків коду? Чи бачите ви величезний блок валідації, кілька операторів if, бізнес-логіку, а потім оператор return?

Ваш контролер виконує роботу, яку він не повинен виконувати.

У контролера є лише одне завдання. Він отримує запит, викликає сервіс для вирішення проблеми та повертає відповідь. Він — офіціант, а не шеф-кухар.

Коли ви поміщаєте валідацію та авторизацію всередину контролера, він перетворюється на безлад. У результаті ви отримуєте 80 рядків коду, до яких ніхто не хоче торкатися.

У Laravel є вбудоване рішення: Form Requests.

Поширена погана практика виглядає так:

  • Валідація вхідних даних
  • Перевірка прав користувача
  • Трансформація даних
  • Виконання бізнес-логіки

Це порушує принцип єдиної відповідальності (Single Responsibility Principle). Клас повинен мати лише одну причину для змін. Контролер змінюється, коли змінюється потік запитів. Він не повинен змінюватися лише тому, що змінилося правило валідації.

Використовуйте цю команду, щоб виправити це: php artisan make:request StorePostRequest

Це створить окремий файл для логіки вашого запиту. Перенесіть ці три речі у Form Request:

  • Авторизація: використовуйте метод authorize() для перевірки прав.
  • Валідація: використовуйте метод rules() для визначення вимог до даних.
  • Підготовка даних: використовуйте prepareForValidation(), щоб очистити або відформатувати дані перед валідацією.

Тепер погляньте на свій контролер ще раз:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

Тепер контролер займає лише два рядки. Він знову поводиться як офіціант.

Laravel автоматично виконує авторизацію та валідацію ще до того, як почнеться виконання методу контролера. Якщо валідація не пройдена, користувач одразу отримає помилку.

Дотримуйтесь цих рекомендацій:

  • Залишайте валідацію в самому методі (inline), якщо вона коротка і використовується лише в одному місці.
  • Використовуйте Form Request, якщо валідація розростається, повторюється або включає авторизацію.
  • Не поміщайте бізнес-логіку у Form Request. Для цього використовуйте Service layer.

Знайдіть свій найбільш захаращений контролер вже сьогодні. Винесіть валідацію у Form Request. Подивіться, як він скоротиться.

Який був найбільший метод store, який ви коли-небудь бачили? Розкажіть у коментарях.

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o