Форумы портала PHP.SU » » Объектно-ориентированное программирование » Где/как лучше валидировать данные

Страниц (2): [1] 2 »
 

1. sKaa - 29 Мая, 2012 - 16:11:26 - перейти к сообщению
etoYA, а что мешает все эти ваши проверки и прочую хренатень засунуть тоже в одну из моделей.. Допустим модель которая фильтрует или проводит валидацию данных ну или хотяб методы валидации внутри одной из моделей? Зачем вы этим контроллер грузите?
2. etoYA - 29 Мая, 2012 - 16:15:19 - перейти к сообщению
sKaa, а вот это уже интересно). Только как бы это нормально организовать, не думал). Но где-то читал, что этим должен заниматся контроллер). Щас подумаю, если че отпишу). А вы поправите, если че)).

А то вот такое, если честно напрягает)

PHP:
скопировать код в буфер обмена
  1.         public function actionSignup(){
  2.                 $view = new View;
  3.                 $user = new User;
  4.                 $view->set(array(
  5.                                                                         'page'  => 'signup',
  6.                                                                         'inc'           => 'forms/signup.phtml'
  7.                 ));
  8.                 if (isset($_POST['signup'])){
  9.                         // если не введен логин
  10.                         if (is_null($this->login)){
  11.                                 $this->error = true;
  12.                                 $this->errstr .= "Введите логин\r\n";
  13.                         }
  14.                         // если некорректный логин
  15.                         elseif (!preg_match('/[-a-zA-Z0-9\.-_]{2,16}/', $this->login)){
  16.                                 $this->error = true;
  17.                                 $this->errstr .= "Логин должен быть 2-16 символов и содержать латинские буквы и цифры. Разрешенные знаки ._-\r\n";                             
  18.                         }
  19.                         // если пустой пароль
  20.                         if (is_null($this->pass)){
  21.                                 $this->error = true;
  22.                                 $this->errstr .= "Введите пароль\r\n";
  23.                         }
  24.                         // если пароли не совпадают
  25.                         elseif ($this->pass != $this->repeat){
  26.                                 $this->error = true;
  27.                                 $this->errstr .= "Введенные пароли не совпадают\r\n";                          
  28.                         }
  29.                         // если некорректный пароль
  30.                         elseif (!preg_match('/[-a-zA-Z0-9]{6,16}/', $this->pass)){
  31.                                 $this->error = true;
  32.                                 $this->errstr .= "Пароль должен быть 6-16 символов и содержать латинские буквы и цифры\r\n";                           
  33.                         }
  34.                         // если пустой е-мейл
  35.                         if (is_null($this->email)){
  36.                                 $this->error = true;
  37.                                 $this->errstr .= "Введите е-мейл\r\n";
  38.                         }
  39.                         // если некорректный емейл
  40.                         elseif (!filter_var($this->email, FILTER_VALIDATE_EMAIL)){
  41.                                 $this->error = true;
  42.                                 $this->errstr .= "Введен некорректный е-мейл адресс\r\n";
  43.                         }
  44.                         // если пользователь существует
  45.                         if ($user->checkUser($this->login) === 1){
  46.                                 $this->error = true;
  47.                                 $this->errstr .= "Пользователь с таким логином уже существует\r\n";                            
  48.                         }
  49.                         if ($this->error === false){
  50.                                 if (!$user->signup($this->login, md5($this->pass), $this->email, 2, time(date('d.m.Y')))){
  51.                                         $this->errstr = 'Регистрация прошла успешно';
  52.                                 }
  53.                                 else $this->errstr = 'Произошла ошибка, попробуйте позже';
  54.                         }
  55.                         $view->error = $this->errstr;
  56.                 }
  57.                 FrontController::setLayout($view->render('index'));
  58.         }
3. Мелкий - 29 Мая, 2012 - 16:28:54 - перейти к сообщению
sKaa пишет:
Зачем вы этим контроллер грузите?

А это ещё один из холиваров: толстая против тонкой модели.
4. etoYA - 29 Мая, 2012 - 16:42:29 - перейти к сообщению
Мелкий пишет:
А это ещё один из холиваров: толстая против тонкой модели.

Впринципе, универсальный валидатор для всех проверок врятле создашь. Или ошибаюсь?
5. sKaa - 29 Мая, 2012 - 16:49:39 - перейти к сообщению
Мелкий, да, тема стара как мир, но всё же тупые, большие контроллеры не лучшая идея...

etoYA, я не буду тут распинаться, просто наведу на мысли :
"Пароль должен быть 6-16 символов и содержать латинские буквы и цифры\r\n";
"Введите е-мейл\r\n";
...
...

А почему-бы не :
PHP:
скопировать код в буфер обмена
  1. class User {
  2.    const
  3.          LOGIN_ERROR_LEN = 'Пароль должен быть 6-16 символов и содержать латинские буквы и цифры',
  4.          LOGIN_EMAIL_EMPTY = 'Введите е-мейл',
  5.          
  6.          LOGIN_HELLO_WORD = 'Здравствуйте %s, вы вошли под ником %s';
  7.  
  8.  
  9.       public function Login($name, $nick){
  10.            return sprintf(self::LOGIN_HELLO_WORD, $name, $nick); // !! Модель ничего не выводит, а только передает с помощью return или свойств класса что-то в контроллера или вьюшку исли она просит!
  11.       }
  12.  
  13. }

(Добавление)
Eazy-E, к вам это не относится !)) У вас даже еще и не началось ничего )))
6. etoYA - 29 Мая, 2012 - 16:52:23 - перейти к сообщению
Просьба к модератором, выделите это в отдельную тему).

От
sKaa пишет:
etoYA, а что мешает все эти ваши проверки и прочую хренатень засунуть тоже в одну из моделей.. Допустим модель которая фильтрует или проводит валидацию данных ну или хотяб методы валидации внутри одной из моделей? Зачем вы этим контроллер грузите?


До

sKaa пишет:
А почему-бы не :
7. etoYA - 29 Мая, 2012 - 16:55:07 - перейти к сообщению
sKaa, пока в новую тему не выделили, вопрос. А проверки где? Вот у меня есть модель User, в которой происходит обращение к базе. Сделал модель UserValidator (в которой попробую ваш способ).

P.S Для каждой константы сделать отдельный метод, или как?. Что-то не понимаю)). Или к примеру

PHP:
скопировать код в буфер обмена
  1. if (is_null($this->login)){
  2.      UserValidation::EMPTY_LOGIN;
  3. }


Или как?)

UPD

Или прям в методе с проверкой?

PHP:
скопировать код в буфер обмена
  1.         public function signup($login, $pass, $email, $group, $created){
  2.                 if (empty($login)) return EMPTY_LOGIN;
  3.                 $r = mysqli()->query("INSERT INTO `users` (`id`, `login`, `password`, `email`, `group`, `created`)
  4.                                                                                                                         VALUES(null, '$login', '$pass', '$email', '$group', '$created')");
  5.                 if (mysqli()->affected_rows != 1) throw new ErrorController('db');
  6.         }
8. Мелкий - 29 Мая, 2012 - 17:10:37 - перейти к сообщению
etoYA пишет:
Впринципе, универсальный валидатор для всех проверок врятле создашь.

А callback'и на что?

sKaa пишет:
но всё же тупые, большие контроллеры не лучшая идея...

Классика жанра:
класс валидации, с десяток предварительно написанных правил, расширение наследованием или каллбеками, отдельный файл человекочитаемых ошибок.

Или описывать сразу на месте $rLoginFormValidate->addRule($mField, $mCondition, $sFailMessage);
Довольно красивый вариант - после isValid методом getErrors возвращать ассоциативный массив 'имя поля'=>'текст ошибки' и в шаблоне смотреть, если элемент не пуст - выводить ошибку прямо напротив элемента.

Я считаю, что валидации самое место в контроллере. Модель должна следить за сохранением и сохранностью данных, зачем ей следить за ненужной для работы логикой? Зачем её минимальная длина пароля, если она должна пароль посолить и захешировать?
9. etoYA - 29 Мая, 2012 - 17:14:28 - перейти к сообщению
Мелкий пишет:
А callback'и на что?

Если б я знал что это такое)).
Мелкий пишет:
Я считаю, что валидации самое место в контроллере. Модель должна следить за сохранением и сохранностью данных, зачем ей следить за ненужной для работы логикой?

Именно так и я читал).
10. sKaa - 29 Мая, 2012 - 17:14:40 - перейти к сообщению
Спойлер (Отобразить)


Очень криво, на коленке писал, но постарался максимально понятно сделать...
11. etoYA - 29 Мая, 2012 - 17:21:04 - перейти к сообщению
sKaa, попробую конечно разобратся, но походу это еще сложновато для меня)).
12. sKaa - 29 Мая, 2012 - 17:22:41 - перейти к сообщению
etoYA, кнопка "Спасибо" слева!)
13. caballero - 29 Мая, 2012 - 17:30:47 - перейти к сообщению
Цитата:
Очень криво, на коленке писал, но постарался максимально понятно сделать...

Да, криво зато понятно.
Хотя мне как раз непонятно с какого перепугу юзер наcледуется от некоей Factory которая на самом деле валидатор.
Вообще данные надо валидировать на входе . до того как они попадут в бзнес-модель
14. sKaa - 29 Мая, 2012 - 17:32:49 - перейти к сообщению
caballero, лень тут размусоливать просто...
15. etoYA - 29 Мая, 2012 - 20:25:34 - перейти к сообщению
sKaa, начал разбиратся и потерялся.. Полностью переписал класс фактори.
Теперь дело за моделью Users. У меня уже есть такая модель, выглядит она сейчас так:

Спойлер (Отобразить)


caballero пишет:
Вообще данные надо валидировать на входе . до того как они попадут в бзнес-модель


Прямо в этой модели делать проверки, или же вообще в контроллере?. Или создать отдельную модель, которая будет вызыватся из контроллера и если она не возвращает ошибок, то вызывать модель, которая уже работает с базой?

 

Powered by ExBB FM 1.0 RC1