Ваш контроллер выполняет не свою работу

Откройте свой контроллер. Найдите метод 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 автоматически выполняет авторизацию и валидацию еще до того, как начнется выполнение метода контроллера. Если валидация не проходит, пользователь сразу получает ошибку.

Следуйте этим рекомендациям:

  • Оставляйте валидацию внутри метода, если она короткая и используется только в одном месте.
  • Используйте 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