4

我正在开发 Zend 应用程序,但对 Zend 没有太多经验,所以只依赖我的 RubyOnRails 经验。

从几篇文章中,我发现大多数验证都是在表单级别实现的——使用 Zend_Form。但这对我来说看起来有点奇怪 - 如何在模型级别进行验证 - 创建基于表单数据的模型并运行 smth $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_Formlike addValidatoraddFilter以及所有有用的东西。

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

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

4

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

于 2010-11-19T11:36:49.927 回答
1

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

于 2010-11-19T11:41:49.297 回答
0

我不同意 db-layer (ZF objects Table, Row) 是验证的正确位置。IHMO 验证是应用程序逻辑或业务约束。

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

您的模型必须知道需要哪些属性(或属性的数据类型),以便有一个正确的验证位置。

正如 Elzo所说——一些模型不代表数据库对象——所以你应该使接口IPersistenceable有一种方法可以验证数据库驱动的模型。这些模型必须实现自己的验证算法。

这种方法很有用——每个模型都可以有不同的验证方式。下一种方法-您可以使用主键+验证方法的基本验证来制作抽象类,并且每个可持久模型都扩展了此类。

于 2010-11-20T00:03:59.183 回答