Ваш контроллер выполняет не свою работу
Откройте свой контроллер. Найдите метод 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
