Проверка Javascript - синхронизация с сервером - PullRequest
5 голосов
/ 20 декабря 2010

В интересах DRY , существует ли структура / библиотека / шаблон проектирования для указания правил проверки в одном месте и их оценки как на стороне клиента, так и на стороне сервера? Это кажется очевидным требованием, но я не встречал ничего подобного.

Чтобы уточнить: меня не интересует серверный код, который генерирует формы с требуемым JavaScript для его проверки - я хочу, чтобы правила проверки были отделены от реализаций на стороне клиента и сервера, например запросить правила проверки через веб-интерфейс API.

Есть что-нибудь в этом роде?

Ответы [ 2 ]

1 голос
/ 20 декабря 2010

Хороший вопрос!

Я провел некоторую проверку MVC, которая получает правила из определения базы данных.Исходя из этого опыта, я бы создал обработчик, который принимает строку спецификации столбца "namespace.table.column" и возвращает набор правил для проверки, предпочтительно в формате JSON.Затем используйте классы css для обозначения входных элементов, которые будут проверены (1), и установите событие проверки для всех элементов ".validate" с помощью JQuery, передав объект проверки этой функции.

Обратите внимание, что при таком подходе вам придется выполнять некоторые правила рендеринга на стороне сервера, чтобы не раскрывать структуру базы данных в javascript!

(1): <input type="text" id="name" class="validate" />

Объект проверки:

возможно, начнем с некоторых базовых проверок типов, продолжая проверку размеров?

JSON structure: validationObject = 
{
    type: 'integer',
    length: '4',
    min: '0',
    max: '10000'
}

function validate(input) {

    var validation = getValidationObject(); // Ajax call

    // perform type check

    // perform length check

    // perform min/max/disallowed content checks

}

Не достаточно подробно, но что-то в этом направлении.

1 голос
/ 20 декабря 2010

Интересный вопрос. Думаю, я бы создал класс со статическим полем для хранения всех правил.

Потребуется одна функция для прямой проверки ввода или возврата функции валидатора для использования на стороне сервера, а другая - для доступа к ajax для получения списка правил, которые будут протестированы в javascript с eval.

Нет никаких причин, $rulesPHP и rulesJS должны быть одинаковыми. На самом деле, я не вижу смысла в проверке одной и той же вещи на каждом конце - возможно, вы захотите проверить разные вещи.

class Validation
{

    protected static $rulesPHP = 
                       array( 
                             'positiveInteger' => array('($x === int($x))', '($x > 0)'),
                             'alphanumericString' => array(....)
                            );

    protected static $rulesJS = 
                       array(
                             'positiveInteger' => array('(x === int(x))', '(x > 0)'),
                             'alphanumericString' =>array(..... )
                            );       

    public static getValidatorPHP($type)
    {
         if (!isset($rulesPHP[$type])) return false;
         $exp = explode(' && ', self::$rulesPHP[$type]);

         return function($x) use ($exp)
         {
              return eval($exp);
         };
    }

    public static getJsRules($type)
    {
         if (!isset($rulesJS[$type])) return false;
         $exp = explode(' && ', self::$rulesJS[$type]);

         return $exp;
    }

}

используется в другом файле:

  $posIntValidator = Validation::getValidatorPHP('positiveInteger');
  $posIntValidator($_POST['text1']);

Ajax с ruleaccessor.php:

    $t = $_GET['type'];
    $out = Validation::getJsRules($t);
    echo $out;

JavaScript:

   function getValidator(type)
   {
       var rules;
       $.get('/ruleaccessor.php?type=' + type, function(in) {rules = in;});
       return function(x){return eval(rules);};
   }

   validatePosInt = getValidator('positiveInteger');
   validatePosInt($('#text1').val());

Конечно, вам придется решить, как вы хотите обрабатывать вещи, которые не проверяются. А если вы хотите иметь разные сообщения для разных ошибок валидации, вам придется хранить сообщение вместе с каждым правилом, и вы не сможете просто разобрать их вместе.

Это далеко не развитая идея, но, надеюсь, общий дизайн может вас куда-нибудь привести.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...