4

私は Zend アプリケーションに取り組んでいますが、Zend の経験があまりないため、RubyOnRails の経験に頼っています。

いくつかの記事から、ほとんどの検証が 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 {
    ...
}

メソッド内で RegExp を使用して検証を簡単に実行できることはわかっていますが、すでに実装されているメソッドなど、すべての便利なものisValidを使用したいと思います。Zend_FormaddValidatoraddFilter

また、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 オブジェクトのテーブル、行) が検証に適した場所であることに同意しません。IHMO 検証は、アプリケーション ロジックまたはビジネス上の制約です。

検証プロセスは、具体的なモデルに配置する必要があります。DB レイヤーはクリーンである必要があり、単純なデータベース操作 (挿入、更新、削除、選択) のみを担当します。

モデルは、必要な属性 (または属性のデータ型) を認識している必要があるため、検証に適した場所があります。

Elzoが言ったように-一部のモデルはDBオブジェクトを表していません-そのため、データベース駆動型モデルの検証メソッドが1つあるインターフェイスIPersistenceableを作成する必要があります。これらのモデルは、独自の検証アルゴリズムを実装する必要があります。

このアプローチは便利です。各モデルにはさまざまな検証方法があります。次のアプローチ - 主キー + 検証メソッドの基本的な検証を使用して抽象クラスを作成し、永続化可能な各モデルがこのクラスを拡張します。

于 2010-11-20T00:03:59.183 に答える