4

我正在开发Zend应用程序,但对Zend没有太多经验,所以仅仅依赖于我的RubyOnRails体验。Zend模型验证

从几篇文章中我发现大多数验证是在Forms级别上实现的 - 使用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方法,但我想使用Zend_Form已实施的方法,如addValidator,addFilter和所有有用的东西。

也是这种在Zend中管理模型的正确方法吗?

任何帮助或建议将非常感激!

回答

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(),您可以执行您自己的验证和过滤值逻辑

+0

看起来很容易猜到。我应该检查Zend lib文件夹:)谢谢! – fantactuka 2010-11-19 12:23:49

1

Zend中的模型不仅是Db对象的表示,大多数对象实际上与数据库无关,并且是Model用于商业逻辑。在这种情况下,采用全球验证方法是没有意义的。 Zend_Db_Table和Row会在使用db对象时执行一些检查,比如检查哪个是主键,但是如果你想要类似Active Record的东西,你必须自己扩展这些类。

+1

同意,但由于'Zend_Db_Table_Row'是db行的表示,所以它有验证是有意义的。基本模型不需要它。 – fantactuka 2010-11-19 12:23:20

0

我不同意数据库层(ZF对象表,行)是验证的正确位置。 IHMO验证是应用程序逻辑或业务约束。

验证过程必须放置在具体的模型中。数据库层必须是干净的,只负责简单地进行数据库操作(插入,更新,删除,选择)。

您的模型必须知道哪些属性是必需的(或属性的数据类型),因此有适合验证的地方。

由于Elzo said - 某些型号并不代表DB的对象 - 因此你应该做接口IPersistenceable其中有一个方法验证为数据库驱动的车型。这些模型必须实现自己的验证算法。

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