我最近才开始 Web 编程,我很惊讶虽然我使用了一个验证库,但我仍然得到 20-30 行代码用于验证,这还不包括错误消息和回调函数。我正在使用 Kohana MVC 框架,我想知道是否有任何方法可以缩短我的验证代码。我试图想到以下
- 将验证代码放入我的模型中(对于像我这样的菜鸟来说,这是相当有的)。
- 创建一个非常小的库来验证条目(挂钩到验证类的东西,因此允许我调用该库以执行重复的过程,如用户注册、编辑和其他东西)
或者有没有更好更有效的方法?
我最近才开始 Web 编程,我很惊讶虽然我使用了一个验证库,但我仍然得到 20-30 行代码用于验证,这还不包括错误消息和回调函数。我正在使用 Kohana MVC 框架,我想知道是否有任何方法可以缩短我的验证代码。我试图想到以下
或者有没有更好更有效的方法?
我使用 Zend_Validate 和 Zend_Forms 进行验证,其中验证代码位于表单 init 方法中。我所要做的就是为每个元素传递一个验证器数组,然后运行 ..
$form->isValid($data);
...在表单之外验证数据。
验证数组很容易超过 30 行,因为我用换行符分隔每个数组条目。但我想如果你为每个元素正确定义细粒度的验证规则,你就会拥有它。
在 Zend 中定义新的验证器真的很容易。
编辑:我发现了一个扩展 Zend 框架的框架,它允许域对象包含自己的验证。它称为 Xyster 框架,但我无法在第一次尝试时让它工作,所以在那之后我没有尝试过。
我强烈建议将验证包括在模型中。一旦你能够做一个,你创建的任何其他人都会容易得多。另外,如果您有多个控制器尝试保存该数据,则无需重新编码验证。Kohana 文档包含一些集成验证库和 ORM 的示例,您应该从那里开始。
这是我处理验证代码的策略。我想通过“验证库”,您的意思是那些只是确保电子邮件是电子邮件,电话号码是数字,并且本质上不是业务规则的那些。
想法是将每个业务规则代码作为一个函子 - 如果是 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 用于查找正确的错误消息和应用到它的格式。
不过,我不太确定您所说的回调是什么意思。