【问题标题】:What is a good approach on dealing with repetitive and lengthy validation codes?处理重复和冗长的验证代码的好方法是什么?
【发布时间】:2009-09-14 04:00:41
【问题描述】:
我最近才开始 Web 编程,我很惊讶虽然我使用了一个验证库,但我仍然得到 20-30 行代码用于验证,这还不包括错误消息和回调函数。我正在使用 Kohana MVC 框架,我想知道是否有任何方法可以缩短我的验证代码。我试着想到以下内容
- 在我的模型中加入验证码(对于像我这样的菜鸟来说,这是非常有必要的)。
- 创建一个非常小的库来验证条目(挂钩到验证类的东西,因此允许我调用该库来执行重复的过程,如用户注册、编辑和其他东西)
或者有没有更好更有效的方法?
【问题讨论】:
标签:
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 用于查找正确的错误消息和应用到它的格式。
我不太清楚你所说的回调是什么意思。