#laravel #laravel5
Почему в Laravel из коробки валидация подразумевается в контроллере, а не в модели?
В документации сказано, что Базовый контроллер App\Http\Controllers\Controller включает
в себя трейт ValidatesRequests, который уже содержит методы для валидации.
Вопрос почему не базовый класс модели сразу содержит методы валидации?
Ведь столько сказано о тонких контроллерах толстых моделях.
Вот например ответ пользователя @HaruAtari с Тостера:
Я считаю, что "толстая модель, тонкий контроллер" - это самый подходящий вариант.
Вся логика приложения должна содержаться в моделях. Модель - это не просто сущности
из бд, это еще и инкапсулированая логика ее обработки. А контроллер должен говорить
модели, что делать и рендерить вьюхи.
Например этот кусок кода неправильный:
class MyController
{
public function myAction()
{
$user = new User();
$user->load($_POST);
if ($user->valiadate()) {
$user->saveToDatabase();
} else {
throw new Exception("...");
}
}
}
Неправильный потому что контроллер знает, как модель сохраняет данные. Что сначала
идет валидация, а потом сохранение в бд. И если вы потом решите не проводить валидацию,
или добавить еще один проверяющий метод (например), то вам придется делать это везде.
Правильно быдет так: в модели определеить метод, содержащий логику:
class User
{
public static function create(array $data)
{
$record= new static;
$record->load($data);
if($record->validate()){
$record->saveToDatabase();
} else {
throw new Exception("...");
}
return $record;
}
}
А в контроллере просто дергать его и передавать туда данные:
class MyController
{
public function myAction()
{
$user = User::create($_POST);
}
}
Таким образом все логика работы модели (в том числе валидация) инкапсулирована снутри
класса, и другие классы не знают, как это происходит.
Такой подход облегчает сопровождение кода а так же облегчает написание тестов.
Ответы
Ответ 1
Конкретно в Laravel модель представляет из себя сущность, например какую-либо таблицу из БД, валидация же относится к бизнес-логике и вынесена соответственно в контроллерОтвет 2
Не знаю на счет того времени, когда задавался вопрос, но на таекщий момент валидацию правильнее всего выносить в Request классы. Это позволяет не дублировать код и не хранить логику валидации ни в контроллерах ни в моделях. https://laravel.com/docs/5.8/validation#form-request-validation
Комментариев нет:
Отправить комментарий