За последние 24 часа нас посетили 22579 программистов и 1141 робот. Сейчас ищут 663 программиста ...

Дублирующаяся валидация (повторные проверки)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Koc, 5 ноя 2009.

  1. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Есть класс UsersManager. Он позволяет добавлять/удалять/редактировать/активировывать пользователей.

    В метод add мы запихиваем массив. Ключи - поля, например mail, name, is_active и все такое. Ессно этот класс у нас самодостаточен, и он проверяет те данные, которые в него пришли. Если че-то не так пошло - бросает исключение с внятным кодом и сообщением.

    Есть форма регистрации. У нее свой валидатор. Да, свой. Почему? ну потому что у меня по стандарту модулей таких есть методы showForm, checkForm и тд. Ну так вот, в этом checkForm все проверяется.

    Итого мы имеем дублирующиеся проверки. Как быть? удалить checkForm я не могу. Это нелогично для меня.
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    оставь все проверки.

    А вообще у тебя единственный вариант.
    Привязывать форму к конкретной модели и форма должна использовать валидатор модели.
    тогда дублирования не будет.

    P.S. Дублирование валидации на клиенте/сервере можно убрать, только убрав валидацию с клиента. Серверная всегда остается. Форма это клиент по отношению к Модели.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дублирование серверной валидации на стороне клиента считаю хорошим тоном. У меня тут дублирование на стороне сервера.

    Про модель .. заманчиво звучит, можешь накидать маленькый примерчик?

    Это коммент Психа мне напомнил о моей проблеме
     
  4. kostyl

    kostyl Guest

    надеюсь он говорит о checkForm как не о форме на клиенте...
    Я вообще не делаю валидацию в объектах.
    Сперва проверяю POST присваиваю чё надо, а потом пытаюсь сохранить, тобишь уже сам UPDATE или INSERT
    PHP:
    1.  
    2. <?php
    3. if($Validator->IsValid()) {
    4. if($User->Save()) {} ellse {}
    5. } else { ошибки}
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1. <?php
    2. $f = new Form();
    3. if ($this->getRequest()->isPost() {
    4.     $f->populateForm($_POST);
    5.     $m = new Model();
    6.     if ($m->validate($f->getData())) {
    7.         // делаем что-нибудь
    8.     } else {
    9.         $f->addErrors($m->getErrors());
    10.     }
    11. }
    Можно поступить жестче - и сделать иньекцию

    PHP:
    1. <?php
    2. $f = new Form(new Model());
    3. $data = $this->getRequest();
    4. $data = $f->filter($data);
    5. if ($f->validate($data)) {
    6. }

    в классе формы
    PHP:
    1. <?php
    2. class Form {
    3.     private $model;
    4.  
    5.     public function __construct(Model $obj) {
    6.         $this->model = $obj;
    7.     }
    8.     public function validate(array $data = array()) {
    9.         return $this->model->validate($data);
    10.     }
    11.  
    12.     public function filter (array $data = array()) {
    13.         return $this->model->filter($data);
    14.     }
    15. }
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Это не важно.
    У него Форма это отдельный объект, который является клиентом Модели.
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    спасибо, попробую провернуть что-то из этого. Но пока это не первая необходимость. Я скорее на будущее интересовался.