【问题标题】:What is a good approach on dealing with repetitive and lengthy validation codes?处理重复和冗长的验证代码的好方法是什么?
【发布时间】:2009-09-14 04:00:41
【问题描述】:

我最近才开始 Web 编程,我很惊讶虽然我使用了一个验证库,但我仍然得到 20-30 行代码用于验证,这还不包括错误消息和回调函数。我正在使用 Kohana MVC 框架,我想知道是否有任何方法可以缩短我的验证代码。我试着想到以下内容

  1. 在我的模型中加入验证码(对于像我这样的菜鸟来说,这是非常有必要的)。
  2. 创建一个非常小的库来验证条目(挂钩到验证类的东西,因此允许我调用该库来执行重复的过程,如用户注册、编辑和其他东西)

或者有没有更好更有效的方法?

【问题讨论】:

  • 您指的是用户参数验证和/或卫生吗?

标签: php validation kohana


【解决方案1】:

我强烈建议在模型中加入验证。一旦你能够做一个,你创建的任何其他人都会容易得多。另外,如果您有多个控制器尝试保存该数据,则无需重新编码验证。 Kohana 文档包含一些集成验证库和 ORM 的示例,您应该从那里开始。

【讨论】:

    【解决方案2】:

    我使用 Zend_Validate 和 Zend_Forms 进行验证,其中验证代码位于表单 init 方法中。我所要做的就是为每个元素传递一个验证器数组,然后运行..

    $form->isValid($data);
    

    ...在表单之外验证数据。

    验证数组很容易超过 30 行,因为我用换行符分隔每个数组条目。但我想如果你为每个元素正确定义细粒度的验证规则,你就会拥有它。

    在 Zend 中定义新的验证器真的很容易。

    edit:我发现了一个扩展 Zend 框架的框架,它允许域对象包含自己的验证。它被称为 Xyster 框架,但我无法在第一次尝试时让它工作,所以之后我没有尝试过。

    【讨论】:

      【解决方案3】:

      这是我处理验证代码的策略。我想“验证库”是指那些只是确保电子邮件是电子邮件,电话号码是数字,并且本质上不是业务规则的那些。

      想法是将每个业务规则代码作为一个函子 - 如果是 PHP,您可以通过使用字符串来定义函数来获得;对于其他语言,您可能必须使用策略模式。为函子定义一个接口(PHP 不需要)并将其转储到一个数组中。

      遍历数组,该数组将返回成功、错误和错误代码到缓冲区。最后,检查错误缓冲区并确定哪个验证失败。使用它来自定义视图。

      这是一个例子

      $checkUniqueUserName = new CheckUniqueUserName();
      $checkEmailNotUsed = new EmailNotUsed();
      $validator = array();
      $validator[$checkUniqueUserName->name()] = $checkUniqueUserName;
      $validator[$checkEmailNotUsed->name()] = $checkEmailNotUsed;
      
      $results = array();
      
      foreach ($validator as $v)
      {
      
        $result[$v->getValidatorName()] = $v->execute($userInfo);
      }
      
      class CheckUniqueUserName()
      {
      
         public function execute($userInfo)
         {
             // SQL blah blah blah
      
            if ($bNameUnique)
              return array ('success' => 1)
            else
              return array ('success' => 0, 'error' => "$name is in used", 'error_code' => 'duplicate_name);
      
         }
      
      }
      

      最后,你会得到一个结果数组,每个数组都填充了一个验证过程,你知道哪个失败了,哪个没有。然后可以将其传递给客户端进行进一步处理,例如突出显示失败的字段。 error_code 用于查找正确的错误消息和应用到它的格式。

      我不太清楚你所说的回调是什么意思。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 2021-01-29
        • 2015-03-28
        • 1970-01-01
        相关资源
        最近更新 更多