マニュアルとAPIを再入力したくないとすぐに言いたいので、できれば既製のソースを参照します。 また、バリデーターの使用方法については説明しません。 検証ルールに基づいてYiiモデルの検証メカニズムを開示して、実際に何が発生し、どの場合にエラーを探すことができるかを理解するようにします。
バリデーターの始まり
そのため、素晴らしいサイトyiiframewrok.ruにはレシピのセクションがあります。
このセクションには、 検証のクイックガイドがあります。 この記事のオリジナルはこのアドレスにあります 。
この記事を読むと、次のことを理解できます。
- 検証ルールを設定する方法
- 特定のルールとは何ですか?
- 標準バリデーターとそのパラメーターのリストをご覧ください
次に、学習する記事「 モデルの作成 ( オリジナル ) 」を読んでください。
- スクリプトについての何か。 (私はこの点を強調したい、それは不十分に文書化されている)
- バリデーターを作成する方法
- 検証の実行方法
ところで、独自のバリデータを作成する例は、本で詳しく説明されています: Yii 1.1 Application Development Cookbook
習得した知識で武装し、次のように呼び出されたときに何が起こるかを理解できます
CModel::validate();
CModelの詳細:: validate();
CModel::validate($attributes=null, $clearErrors=true);
メソッド
CModel::validate($attributes=null, $clearErrors=true);
-入力として2つのオプションのパラメーターを受け入れます(検証用の属性のリストと、バリデーターを呼び出す前にエラーのある配列をクリアするclearErrorsキー)
これは、標準のYiiモデルを拡張し、
CModel::addError();
メソッドを使用する場合に理解することが重要
CModel::addError();
独自の目的のため、
CModel::validate();
データが正常に検証された場合はtrueを返し、
CModel::hasErrors();
場合はfalseを返します
CModel::hasErrors();
trueを返します。
さらに、
CModel::beforeValidate();
メソッドをオーバーライドすると、蒸発が機能しないことに注意してください
CModel::beforeValidate();
彼は偽りを返しました。
テキストを希釈するために、コードを見てみましょう。すべてが多かれ少なかれ明確になります。
- public function validate ( $ attributes = null 、 $ clearErrors = true )
- {
- if ( $ clearErrors )
- $ this- > clearErrors ( ) ;
- if ( $ this- > beforeValidate ( ) )
- {
- foreach ( $ this- > getValidators ( ) as $ validator )
- $ validator- > validate ( $ this 、 $ attributes ) ;
- $ this- > afterValidate ( ) ;
- 戻り ます! $ this- > hasErrors ( ) ;
- }
- 他に
- falseを 返し ます 。
- }
ここにはもう質問はないと思うので、
CModel::getValidator()
メソッドを見てみましょう。
foreach ( $ this- > getValidators ( ) as $ validator )
CModel::rules()
メソッドで指定されたルールに基づいてYiiがバリデーターのリストを取得する方法を理解する
CModel :: getValidators()
- パブリック 関数 getValidators ( $ attribute = null )
- {
- if ( $ this- > _validators === null )
- $ this- > _validators = $ this- > createValidators ( ) ;
- $バリデーター = 配列 ( ) ;
- $シナリオ = $ this- > getScenario ( ) ;
- foreach ( $ this- > _validators as $ validator )
- {
- if ( $バリデーター -> applyTo ( $シナリオ ) ) {
- if ( $ attribute === null || in_array ( $ attribute 、 $ validator- > attributes 、 true ) )
- $バリデーター [ ] = $バリデーター 。
- }
- }
- $バリデーターを 返し ます。
- }
メソッドは、モデル内のルールによって記述されたバリデーターの配列を返します。
ここで興味深い点は、7行目から始まります。 上記のスクリプトについて言及しました。 したがって、ここでは、メソッド
CValidator::applyTo($scenario);
場合にのみ、バリデーターがチェーンに追加されることが
CValidator::applyTo($scenario);
trueを返します。 「on」パラメーターが設定されていない場合、またはバリデーターがモデルが実行されるシナリオを参照する場合にtrueを返します。
どうぞ CModelメソッドを考えてみましょう
CModel:createValidators();
$ this- > _validators = $ this- > createValidators ( ) ;
本質的に検証ルールの下位レベルおよび最終レベルの分析になります。その後、いくつかの結果をまとめます。
完了間近:CModel :: createValidators()
- パブリック 関数 createValidators ( )
- {
- $ validators = new CList ;
- foreach ( $ this- > rules ( ) as $ rule )
- {
- if ( isset ( $ rule [ 0 ] 、 $ rule [ 1 ] ) ) //属性、バリデーター名
- $ validators- > add ( CValidator :: createValidator ( $ rule [ 1 ] 、 $ this 、 $ rule [ 0 ] 、 array_slice ( $ rule 、 2 ) ) )) ;
- 他に
- throw new CException ( Yii :: t ( 'yii' 、 '{class}には無効な検証ルールがあります。ルールは検証する属性とバリデーター名を指定する必要があります。' 、 array ( '{class}' => get_class ( $この ) ) ) ) ;
- }
- $バリデーターを 返し ます。
- }
それで、我々はより低いレベルに到達しました。 このメソッドは、
CModel::rules()
説明されている検証ルールの分析を行い、静的クラスメソッド
CValidator::createValidator()
を使用して、これらのルールで記述された検証オブジェクトを作成します。
CValidator::createValidator()
メソッドのAPIを参照し、検証ルールの標準パラメーターを覚えておいてください
- 配列 (
- 「モデルフィールドのリスト」 、
- 「バリデーター」
- 'on' => 'スクリプト名' 、
- 'メッセージ' => 'エラーメッセージ' 、
- ...検証パラメーター...
- ) ;
、すべてがすぐに所定の位置に収まります。
まとめると
ご覧のとおり、検証規則を解析するアルゴリズムはそれほど複雑なものではありません。 主なことは、問題を理解し、理解したいという欲求を持つことです。 コードがどのように機能するかを理解すると、開発中に何かがうまくいかず、プログラムが正しく実行されない場合に、さまざまな疑問が生じます。
結論として、検証ツールが期待どおりに機能しない場合や、検証ルールが満たされない理由を理解するのに役立ついくつかの機能を要約できます。
-
CModel::validate()
メソッドが呼び出されると、CModel::beforeValidate()
メソッドがCModel::beforeValidate()
いるかどうかがチェックCModel::beforeValidate()
ます。
メソッドが失敗した場合、検証は失敗したと見なされます -
CModel::hasErrors()
メソッドがtrueを返す場合、検証は失敗したと見なされます -
CModel::getValidators()
メソッドが呼び出されると、現在のスクリプトに関連するバリデーターと、スクリプトが検証ルールで指定されていないバリデーターのみが追加されます