Javascript验证 - 与服务器同步

Dav*_*ang 5 javascript validation client

为了DRY的利益,是否有框架/库/设计模式在一个地方指定验证规则,并在客户端和服务器端评估它们?这似乎是一个明显的要求,但我没有遇到类似的事情.

澄清一下:我对使用所需的javascript生成表单以验证它的服务器端代码不感兴趣 - 我希望验证规则与客户端和服务器端实现分离,例如通过基于Web的请求验证规则API.

有什么类似的吗?

jon*_*tar 1

有趣的问题。我想我应该设置一个带有静态字段的类来存储所有规则。

它将需要一个函数来直接验证输入或返回一个在服务器端使用的验证器函数,另一个函数由 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在另一个文件中使用:

  $posIntValidator = Validation::getValidatorPHP('positiveInteger');
  $posIntValidator($_POST['text1']);
Run Code Online (Sandbox Code Playgroud)

Ajax 与ruleaccessor.php:

    $t = $_GET['type'];
    $out = Validation::getJsRules($t);
    echo $out;
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)

当然,您必须决定如何处理未验证的事情。如果您想针对不同的验证错误使用不同的消息,则必须将消息与每个规则一起存储,并且不能简单地将它们分解在一起。

这还远不是一个成熟的想法,但希望总体设计能让你有所收获。