Zend模型验证

4

我正在处理Zend应用程序,但是对Zend没有太多的经验,所以只能依靠我的RubyOnRails经验。

从几篇文章中发现,大部分验证是在表单级别上实现的 - 使用Zend_Form。但这对我来说有点奇怪 - 在模型级别上进行验证如何呢 - 基于表单数据创建一个模型,然后运行像$model->isValid(); 这样的命令,这样做是有意义的,因为我有时需要创建一些没有表单提交请求的模型。

我目前的模型流程:

ProductMapper extends Zend_Db_Table
Product extends Zend_Db_Table_Row

鉴于我正在做类似于以下的事情

$mapper = new ProductMapper();
$product => $mapper->find(...);

// Do some staff with this model
// And want to check if it's valid before saving

if ($product.isValid()) {
    $product.save(); // Zend_Db_Table_Row method
} else {
    ...
}

我知道我可以在isValid方法内部使用RegExp进行验证,但是我想使用已经实现的Zend_Form中的方法,例如addValidatoraddFilter以及所有有用的东西。

另外,这是在Zend中管理模型的正确方式吗?

任何帮助或建议都将不胜感激!

3个回答

2
您可以像这样使用与Zend_Form相同的过滤器和/或验证器。
$validator = new Zend_Validate_Allnum();
if ($validator->isValid($data)
do some code

或者
$filter = new Zend_Filter_StringTrim();
$filteredVal = $filter->filter($val);

因此,您可以在行类中创建自己的方法isValid(),在其中执行自己的验证和过滤值的逻辑。


看起来很容易猜到。我应该检查一下Zend lib文件夹:) 谢谢! - fantactuka

1
Zend中的模型不仅仅是数据库对象的表示,实际上大多数对象与数据库无关,而是业务逻辑的模型。在这种情况下,拥有全局验证方法是没有意义的。当使用数据库对象时,Zend_Db_Table和Row会为您执行一些检查,例如检查哪个是主键,但如果您想要像Active Record那样的东西,您必须自己扩展这些类。

1
同意,但由于Zend_Db_Table_Row是数据库行的表示,因此它具有验证功能是有意义的。基本模型不需要它。 - fantactuka

0

我不同意将 db-layer(ZF 对象表、行)作为验证的正确位置。在我看来,验证是应用逻辑或业务约束。

验证过程必须放置在具体的 Model 中。DB 层必须保持干净,只负责执行简单的数据库操作(插入、更新、删除、选择)。

您的 Model 必须知道哪些属性是必需的(或属性的数据类型),因此有一个正确的地方进行验证。

正如 Elzo said 的 - 一些 Model 并不代表 DB 对象 - 因此,您应该制作接口 IPersistenceable,它具有一个名为 validate 的方法,用于驱动数据库的模型。这些模型必须实现自己的验证算法。

这种方法很有用 - 每个模型都可以有各种验证方式。下一个方法 - 您可以创建一个基本验证的抽象类,包括主键 + 验证方法,并使每个可持续模型扩展此类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接