我正在研究Zend应用程序,但对Zend没有太多经验,所以只依靠我的RubyOnRails经验。
从几篇文章中我发现大多数验证都是在表单级别实现的 - 使用Zend_Form。但对我来说看起来有点奇怪 - 如何在模型级别进行验证 - 基于表单数据创建模型并像$model->isValid();
一样运行smth,因为我创建了一些没有表单发布请求的模型,这是有意义的。
我目前的模型流程:
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
中已经实现的方法,例如addValidator
,addFilter
和所有有用的东西。
这也是在Zend中管理模型的正确方法吗?
非常感谢任何帮助或建议!
答案 0 :(得分: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(),您可以在其中执行自己的验证和过滤值的逻辑
答案 1 :(得分:1)
Zend中的模型不仅仅是Db对象的表示,大多数对象实际上与数据库无关,而且是业务逻辑的模型。在这种情况下,具有全局验证方法没有意义。 Zend_Db_Table和Row会在使用db对象时为你做一些检查,比如检查哪个是主键,但如果你想要像Active Record这样的东西,你必须自己扩展这些类。
答案 2 :(得分:0)
我不同意db-layer(ZF对象Table,Row)是验证的正确位置。 IHMO验证是应用程序逻辑或业务约束。
验证过程必须放在具体的模型中。数据库层必须是干净的,并且只负责简单的数据库操作(插入,更新,删除,选择)。
您的模型必须知道需要哪些属性(或属性的数据类型),以便有正确的验证位置。
作为Elzo said - 某些模型不代表数据库对象 - 因此您应该使接口 IPersistenceable 对数据库驱动的模型有一种方法验证。这些模型必须实现自己的验证算法。
这种方法很有用 - 每种模型都可以有各种验证方式。下一步 - 您可以使用主键+验证方法的基本验证来创建抽象类,并且每个可持久性模型都会扩展此类。