4

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

私はいくつかの記事から、ほとんどの検証がフォームレベルで実装されていることを発見しました。Zend_Formです。しかし、私は少し奇妙に見えます - モデルレベルで検証する方法 - フォームデータに基づいてモデルを作成し、$model->isValid();のようなsmthを実行すると、フォームの投稿要求なしでいくつかのモデルを作成するので意味があります。

私の現在のモデルの流れ:

ProductMapper extends Zend_Db_Table 
Product extends Zend_Db_Table_Row 

そして、私は私が単にisValidメソッド内で正規表現で検証を行うことができますことを認識し、私がしたい

$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 { 
    ... 
} 

のようなものをやっている与えられましたZend_Formからすでに実装されているメソッドを使用することができます。addValidatoraddFilterなど、その有用なすべてのものがあります。

また、Zendのモデルを管理する正しい方法はありますか?

ご協力いただきありがとうございます。あなたはZend_Formのと同じフィルタおよび/またはバリデータを使用することができますが、どこのことができます。この

$validator = new Zend_Validate_Allnum(); 
if ($validator->isValid($data) 
do some code 

または

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

ようなので、あなたの行クラスで独自のメソッドのisValid()を作成することができます

答えて

2

妥当性検査と値のフィルタリングの独自のロジックを実行する

+0

見た目が簡単です。私はZendのlibフォルダをチェックしたはずです:)ありがとう! – fantactuka

1

ZendのモデルはDbオブジェクトの表現であるだけでなく、ほとんどのオブジェクトはデータベースとはまったく関係なくモデルですビジネスロジック用。この文脈では、グローバルな検証方法は意味をなさない。 Zend_Db_TableとRowは、主キーであるかどうかを確認するなど、dbオブジェクトを使用して再生するときにいくつかのチェックを行いますが、Active Recordのようなものを望む場合は、それらのクラスを自分で拡張する必要があります。

+1

同意します。しかし、 'Zend_Db_Table_Row'はdb行を表現しているので、検証があることは意味があります。基本モデルはそれを必要としません。 – fantactuka

0

私は、db-layer(ZF objects Table、Row)が検証のための適切な場所であることに同意しません。 IHMO検証はアプリケーションロジックまたはビジネス制約です。

検証プロセスは、コンクリートモデルに配置する必要があります。 DB層はきれいでなければならず、単にデータベース操作(挿入、更新、削除、選択)を行うだけです。

モデルでは、必要な属性(または属性のデータ型)を知っているため、検証のための適切な場所があります。 Elzo saidとして

- 一部のモデルには、DBオブジェクトを表すされていません - あなたはデータベース駆動型モデルのためを検証一つの方法を持っているインタフェースIPersistenceableを行う必要があります。これらのモデルは、自身の検証アルゴリズムを実装する必要があります。

このアプローチは有用です - 各モデルには様々な検証方法があります。次のアプローチ - 主キー+検証メソッドの基本的な検証で抽象クラスを作ることができ、各持続可能なモデルはこのクラスを拡張します。