Pull to refresh

Полноценная валидация данных

Lumber room
Проблема валидации данных не раз поднималась на Хабре. Обсуждались серверная валидация и валидация на стороне клиента. Описывалось применение для этой цели различных фреймворков таких как Yii, CodeIgniter, Vanadium, .NET и плагинов JQuery.
Но не было комплексного взгляда на эти проблемы, как на логически единую задачу как для сервера, так и для клиента.
Валидация данных должна быть прозрачной не зависимо от того, где она проходит — на клиенте или на сервере, не нужно разбивать ее на две отдельных части и делать отдельную реализацию для каждой из задач. После нескольких проектов и выполнения одной и той же работы приходит понимание, что как было бы хорошо объединить эти части вместе и не тратить свое драгоценное время на фактическое дублирование кода.
Итак, вопрос ставится как создание прозрачной системы валидации данных без логического разделения на клиента и сервера. Валидация на стороне сервера должна автоматически обеспечивать валидацию на стороне клиента без дополнительных усилий со стороны программиста.

Для решения этой задачи будем использовать уже существующие модули валидации данных на PHP и на Javascript. Первый фреймворк будет отвечать за валидацию на стороне сервера, а второй фреймворк будет валидировать данные на стороне клиенте. Они будут нашими рабочими лошадками и нам остается только найти способ связать эти фреймворки между собой.
Решаем проблему тривиально — создаем класс для декларирования правил проверки данных. Смысл этого в том, что имея набор каких-то правил мы сможем применить их как на стороне сервера, так и на стороне клиента. Есть своя специфика, но она сводится к тому, чтобы правильно интерпретировать эти правила в команды конкретного фреймворка валидации.
Теперь валидация будет у нас происходить по следующей схеме:
1. Определяем правила
2. Правила передаем PHP классу-обертке для применения на стороне сервера.
3. Правила преобразуем в массив JavaScript и передаем клиенту, где в нужный момент данные будут проверены JavaScript классом-оберткой на стороне клиента.

Пример:

$validate=new Validate();
$validate//определение правил
        ->ruleUrl('url','введите правильно ссылку')
        ->ruleEmail('email','введите правильно адрес электронной почты',0);
if($_POST)     
        $validate->check($_POST,$errors);//проверка массива $_POST, ошибки помещаются в массив $errors
$js_main=$validate->js('main');//преобразуем правила в объект JavaScript
…..
function validate()//функция на JavaScript для валидации данных
{
        <?=$js_main?>
        return main.checkForm($('#form'));//данные берутся из формы по именам
}


Работающий пример вы можете найти здесь, а исходники примера здесь. Проверка работает на стороне клиента при включенном Javascript, в противном случае валидация осуществляется только на стороне сервера.
Tags:
Hubs:
Total votes 8: ↑5 and ↓3 +2
Views 2.9K
Comments 5
Comments Comments 5

Posts