@kofon
Я человек

Контроллеры должны контролировать. Всегда всё?

Язык не важен, в моём случае это PHP!!!
Делаю всё без инкапсуляции!

Пусть есть некоторая модель, которая взаимодействует с БД (save сохраняет в БД).
$user = new UserModel();
$user->email = 'vasya@mail.ru';   // email  - верный
$user->password = '123';          // пароль - неверный, меньше 6-ти символов
$user->save();                    // должна ли быть тут ошибка (wrong password)?

Должна?
Или мы в этом же месте должны проверять мейл и пароль на валидность.
Где это должно проверяться?



Второй пример:
Пусть есть некоторый товар в магазине, у которого обязательно должно быть название, а остальные поля (цена, описание) могут отсутствовать.
$order = new Order();
$order->save();           // ошибка, $order->name = null - по умолчанию;

Должна ли модель бросать исключение в этом случае? Или мы должны проверять перед сохранением?
Где это должно проверяться?

И последний:
Пусть поле price (цена) должно быть числом, а мы ставим строку (например)
$order = new Order();
$order->name = 'example order';
$order->price = 'error here!';     // не число!

Я вырос на "жёстко" типизированных языках (C#, Java), где мы вообще не сможем такое провернуть, но если это ЯП с динамической типизацией?

Просто модель точно знает про столбцы, какие из них Nullable, и "рыгнуться". Но все пишут, что контроллеры должны проверять входные данные!
  • Вопрос задан
  • 653 просмотра
Решения вопроса 1
@kofon Автор вопроса
Я человек
В общем люди, я извлёк следующие уроки.

1) Пароль может храниться в БД в любом виде, но не NULL . А значит, что если пароль есть, то его можно сохранять. Проверку на валидность пусть делает тот кому это надо (контроллер).

2) Если поле NO NULL, а в модель бросили NULL, то она бросает исключение, т.к. она знает, как хранится оно в самой БД, null или не null

3) Модель будет проверять переданное число на соответствие типа, и в случае неуспеха (строка вместо числа), она бросит исключение, потому как нелогично делать такую вещь:
$this->price = (float) $this->price;
А если вдруг так строка - "Вася"? То она просто сохранит "1", как же так, нелогично!
Однако [price = -10] модель съест, потому как в БД можно такое записать.



Если у кого-то есть другое мнение, прошу продискутировать!
Если прошло время (сейчас: 13.05.15г.), но вы не согласны со мной, пожалуйста напишите мне: kofon95@mail.ru
Я серьёзно!
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
Denormalization
@Denormalization
Делаю отдельные классы валидации.
В контроллере:

// ...
$input = $request->all();
$validator = new OrderValidator($input);
if ($validator->fails())
  // ошибка, обрабатываем

$model = new Order;
$model->create($input);


Как-то так. Имхо модель не должна быть слишком умной. Она должна делать то, что ей сказали, она не должна сама решать хочет она сохранять или нет.
Ответ написан
Комментировать
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
В модели. Контроллер - связующее звено, оно должно роутить, но не думать.
Ответ написан
Комментировать
mramor
@mramor
нечего о себе рассказывать.
$order->price = 'error here!'; // не число!
$order->price = (float)'error here!';
Уже число :) Контроль зависит чисто от программиста, вас никто не заставляет. Если вам не привычно, то в пхп можно жестко типизировать.

Личное мое мнение - проверять нужно все, приводить к нужным типам перед сохранением в бд.
Ответ написан
Комментировать
@entermix
Если при сохранении модели есть ошибки, она должна бросать исключение.

Как то так:

$user = new UserModel();
$user->email = 'vasya@mail.ru';   // email  - верный
$user->password = '123';          // пароль - неверный, меньше 6-ти символов

try {
   $user>save();
}
catch ($e) {
// Ошибки
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы