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

    Проблема валидации данных не раз поднималась на Хабре. Обсуждались серверная валидация и валидация на стороне клиента. Описывалось применение для этой цели различных фреймворков таких как 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, в противном случае валидация осуществляется только на стороне сервера.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 5

      0
      Идея прекрасная, но реализация пугает, одно <?=$js_main?> чего стоит.
      Это бы в виде нормальной библиотеки оформить, тогда использовать приятнее будет в проектах.
        0
        Т.е. основная мысль — генерация клиентской валидации на сервере? Весьма интересно, надо обдумать.
        Позволю себе несколько замечаний/предложений:
        1. Зачем передавать в правилах текст сообщений? Проще их хранить в свойстве объекта Validate.
        2. Наверное лучше заменить в объявлении свойств private на protected — так можно будет расширять класс.
        3. Прилагаемая в примере форма не поддерживает редактирование сохраненных данных — поля заполняются только данными из $_POST. Сразу возникает и следующий вопрос — при редактировании лучше проверять только измененные свойства (экономим время).
        4. В идеале сообщения об ошибках должны показываться рядом с соответствующими контролами.
        5. Генерацию js можно попробовать реализовать через шаблоны и плейсхолдеры — должно быть более читаемо.
          +1
          Мне встречалась валидация по такому принципу в одном php-шном фреймворке. Это действительно удобно. Конечно есть свои исключения, просто потому что не всё возможно проверить на клиенте, но тем не менее, программисты были избавлены от рутинной работы и не было дублирование логики на 2х языках, а значит легче изменить валидацию.
            +1
            Вообще не самая лучшая идея.
            Давно известно, что системы генерирующие формуляры проверки на клиенте страдают несколькими проблемами:

            1. сложность смены поведения валидатора на уровне клиента. Например, алерты не устраивают
            2. сложность подключения собственного JS внутрь сгенерированного
            3. ну и стандартные проблемы — строковые (мультиязычность)

            поэтому многие команды, успешно забивают на эти вопросы и разрабатывают для каждой платформы отдельный валидатор :(
              0
              В ответ на ваши замечания по пунктам:
              1. и 2. в примере видно, что способ интерпретации правил генератором не задаются, а вся реализация заключена в Javascript классе Validate, что позволяет настроить процесс валидации по желанию
              3. Не совсем понял о чем вы, валидатор будет высвечивать только те сообщения, которые вы туда передали, а зависимости от того, на каком языке эти сообщения, не вижу. Если вы говорите о проблеме валидации непосредственно строк как входных данных, то тут при использовании UTF-8 особых заморочек нет.

            Only users with full accounts can post comments. Log in, please.