Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Где/как лучше валидировать данные

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
sKaa
Отправлено: 29 Мая, 2012 - 16:11:26
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Выделено в отдельную тему из темы "Как получить имя дочернего класса внутри класса-родителя?"
etoYA, а что мешает все эти ваши проверки и прочую хренатень засунуть тоже в одну из моделей.. Допустим модель которая фильтрует или проводит валидацию данных ну или хотяб методы валидации внутри одной из моделей? Зачем вы этим контроллер грузите?
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 16:15:19
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Выделено в отдельную тему из темы "Как получить имя дочернего класса внутри класса-родителя?"
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.         }

(Отредактировано автором: 29 Мая, 2012 - 16:16:09)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Мая, 2012 - 16:28:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Перенесено из темы "Как получить имя дочернего класса внутри класса-родителя?"
sKaa пишет:
Зачем вы этим контроллер грузите?

А это ещё один из холиваров: толстая против тонкой модели.


-----
PostgreSQL DBA
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 16:42:29
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Перенесено из темы "Как получить имя дочернего класса внутри класса-родителя?"
Мелкий пишет:
А это ещё один из холиваров: толстая против тонкой модели.

Впринципе, универсальный валидатор для всех проверок врятле создашь. Или ошибаюсь?

(Отредактировано автором: 29 Мая, 2012 - 16:36:04)

 
 Top
sKaa
Отправлено: 29 Мая, 2012 - 16:49:39
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


Перенесено из темы "Как получить имя дочернего класса внутри класса-родителя?"
Мелкий, да, тема стара как мир, но всё же тупые, большие контроллеры не лучшая идея...

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, к вам это не относится !)) У вас даже еще и не началось ничего )))

(Отредактировано автором: 29 Мая, 2012 - 16:36:30)

 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 16:52:23
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Перенесено из темы "Как получить имя дочернего класса внутри класса-родителя?"
Просьба к модератором, выделите это в отдельную тему).

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


До

sKaa пишет:
А почему-бы не :
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 16:55:07
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Перенесено из темы "Как получить имя дочернего класса внутри класса-родителя?"
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.         }

(Отредактировано автором: 29 Мая, 2012 - 16:56:18)

 
 Top
Мелкий Супермодератор
Отправлено: 29 Мая, 2012 - 17:10:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




etoYA пишет:
Впринципе, универсальный валидатор для всех проверок врятле создашь.

А callback'и на что?

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

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

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

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


-----
PostgreSQL DBA
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 17:14:28
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Мелкий пишет:
А callback'и на что?

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

Именно так и я читал).
 
 Top
sKaa
Отправлено: 29 Мая, 2012 - 17:14:40
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


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


Очень криво, на коленке писал, но постарался максимально понятно сделать...
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 17:21:04
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




sKaa, попробую конечно разобратся, но походу это еще сложновато для меня)).
 
 Top
sKaa
Отправлено: 29 Мая, 2012 - 17:22:41
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


etoYA, кнопка "Спасибо" слева!)
 
 Top
caballero
Отправлено: 29 Мая, 2012 - 17:30:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Очень криво, на коленке писал, но постарался максимально понятно сделать...

Да, криво зато понятно.
Хотя мне как раз непонятно с какого перепугу юзер наcледуется от некоей Factory которая на самом деле валидатор.
Вообще данные надо валидировать на входе . до того как они попадут в бзнес-модель


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
sKaa
Отправлено: 29 Мая, 2012 - 17:32:49
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


caballero, лень тут размусоливать просто...
 
 Top
etoYA
Отправлено: 29 Мая, 2012 - 20:25:34
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




sKaa, начал разбиратся и потерялся.. Полностью переписал класс фактори.
Теперь дело за моделью Users. У меня уже есть такая модель, выглядит она сейчас так:

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


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


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

(Отредактировано автором: 29 Мая, 2012 - 20:30:19)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB