Есть класс UsersManager. Он позволяет добавлять/удалять/редактировать/активировывать пользователей. В метод add мы запихиваем массив. Ключи - поля, например mail, name, is_active и все такое. Ессно этот класс у нас самодостаточен, и он проверяет те данные, которые в него пришли. Если че-то не так пошло - бросает исключение с внятным кодом и сообщением. Есть форма регистрации. У нее свой валидатор. Да, свой. Почему? ну потому что у меня по стандарту модулей таких есть методы showForm, checkForm и тд. Ну так вот, в этом checkForm все проверяется. Итого мы имеем дублирующиеся проверки. Как быть? удалить checkForm я не могу. Это нелогично для меня.
оставь все проверки. А вообще у тебя единственный вариант. Привязывать форму к конкретной модели и форма должна использовать валидатор модели. тогда дублирования не будет. P.S. Дублирование валидации на клиенте/сервере можно убрать, только убрав валидацию с клиента. Серверная всегда остается. Форма это клиент по отношению к Модели.
дублирование серверной валидации на стороне клиента считаю хорошим тоном. У меня тут дублирование на стороне сервера. Про модель .. заманчиво звучит, можешь накидать маленькый примерчик? Это коммент Психа мне напомнил о моей проблеме
надеюсь он говорит о checkForm как не о форме на клиенте... Я вообще не делаю валидацию в объектах. Сперва проверяю POST присваиваю чё надо, а потом пытаюсь сохранить, тобишь уже сам UPDATE или INSERT PHP: <?php if($Validator->IsValid()) { if($User->Save()) {} ellse {} } else { ошибки}
PHP: <?php $f = new Form(); if ($this->getRequest()->isPost() { $f->populateForm($_POST); $m = new Model(); if ($m->validate($f->getData())) { // делаем что-нибудь } else { $f->addErrors($m->getErrors()); } } Можно поступить жестче - и сделать иньекцию PHP: <?php $f = new Form(new Model()); $data = $this->getRequest(); $data = $f->filter($data); if ($f->validate($data)) { } в классе формы PHP: <?php class Form { private $model; public function __construct(Model $obj) { $this->model = $obj; } public function validate(array $data = array()) { return $this->model->validate($data); } public function filter (array $data = array()) { return $this->model->filter($data); } }
спасибо, попробую провернуть что-то из этого. Но пока это не первая необходимость. Я скорее на будущее интересовался.