Валидация должна быть в модели
Только модель знает «детали» бизнеса. только модель знает, какие данные являются приемлемыми, а какие - нет. контроллер просто знает, как «использовать» модель.
например: допустим, нам нужна функциональность регистрации новых пользователей в нашей системе.
Модель:
public function registerUser(User $user){
//pseudo code
//primitive validation
if(!isInt($user->age)){
//log the invalid input error
return "age";
}
if(!isString($user->name)){
//log the invalid input error
return "name";
}
//business logic validation
//our buisnees only accept grown peoples
if($user->age < 18){
//log the error
return "age";
}
//our buisness accepts only users with good physique
if($user->weight > 100){
//log the error
return "weight";
}
//ervery thing is ok ? then insert the user
//data base query (insert into user (,,,) valeues (?,?,?,?))
return true;
}
Теперь задача контроллера / ов состоит в том, чтобы «использовать» функцию модели registerUser()
без знания того, как модель будет выполнять валидацию, или даже того, что считается «действительным» или нет!
Контроллер:
$user = new User();
$user->age = isset($_POST['age']) ? $_POST['age'] : null;
$user->name = isset($_POST['name']) ? $_POST['name'] : null;
$user->age = isset($_POST['weight']) ? $_POST['weight'] : null;
$result = $theModel->registerUser($user);// <- the controller uses the model
if($result === true){
//build the view(page/template) with success message and die
}
$msg = "";
//use the return value from the function or you can check the error logs
switch ($result){
case"age" :
$msg = "Sorry, you must be over 18";
break;
case "name":
$msg = "name field is not correct";
break;
case "weight":
$msg = "Sorry, you must have a good physique";
break;
}
//build the view(page/template) with error messages and die
Класс пользователя
class User {
public $age;
public $name;
public $weight;
}
, имеющая подобную архитектуру, полностью «освободит» контроллеры от деталей бизнес-логики, что хорошо -
Предположим, что мы хотим создать другую форму регистрации пользователей где-то еще на веб-сайте (и нам будет выделен другой контроллер). теперь другой контроллер будет использовать тот же метод модели registerUser()
.
Но если мы распределили логику проверки между контроллером и моделью, они не будут разделены - что плохо и против MVC - это означает, что каждый раз, когда вам нужно создать новый вид и контроллер для регистрации нового пользователя, вы должны использовать один и тот же старый контроллер и модель вместе. Более того, если изменится бизнес-логика (в нашем спортивном клубе мы теперь принимаем подростков), вы только измените код в функции модели registerUser()
. код контроллера остается прежним.