Yiiでの検証

良い一日。 今日は、これらのモデルの検証など、Yiiフレームワークの興味深い機能を明らかにしたいと思います。 執筆時点では、フレームワークの現在のバージョンは1.1.10であり 、実際に検証を検討します。
マニュアルとAPIを再入力したくないとすぐに言いたいので、できれば既製のソースを参照します。 また、バリデーターの使用方法については説明しません。 検証ルールに基づいてYiiモデルの検証メカニズムを開示して、実際に何が発生し、どの場合にエラーを探すことができるかを理解するようにします。

バリデーターの始まり



そのため、素晴らしいサイトyiiframewrok.ruにはレシピのセクションがあります。
このセクションには、 検証のクイックガイドがあります。 この記事のオリジナルはこのアドレスにあります
この記事を読むと、次のことを理解できます。
  1. 検証ルールを設定する方法
  2. 特定のルールとは何ですか?
  3. 標準バリデーターとそのパラメーターのリストをご覧ください

次に、学習する記事「 モデルの作成オリジナル」を読んでください。
  1. スクリプトについての何か。 (私はこの点を強調したい、それは不十分に文書化されている)
  2. バリデーターを作成する方法
  3. 検証の実行方法

ところで、独自のバリデータを作成する例は、本で詳しく説明されています: 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(); 彼は偽りを返しました。
テキストを希釈するために、コードを見てみましょう。すべてが多かれ少なかれ明確になります。
  1. public function validate $ attributes = null $ clearErrors = true
  2. {
  3. if $ clearErrors
  4. $ this- > clearErrors ;
  5. if $ this- > beforeValidate
  6. {
  7. foreach $ this- > getValidators as $ validator
  8. $ validator- > validate $ this $ attributes ;
  9. $ this- > afterValidate ;
  10. 戻り ます! $ this- > hasErrors ;
  11. }
  12. 他に
  13. falseを 返し ます
  14. }

ここにはもう質問はないと思うので、 CModel::getValidator()メソッドを見てみましょう。
foreach $ this- > getValidators as $ validator

CModel::rules()メソッドで指定されたルールに基づいてYiiがバリデーターのリストを取得する方法を理解する

CModel :: getValidators()


  1. パブリック 関数 getValidators $ attribute = null
  2. {
  3. if $ this- > _validators === null
  4. $ this- > _validators = $ this- > createValidators ;
  5. $バリデーター = 配列 ;
  6. $シナリオ = $ this- > getScenario ;
  7. foreach $ this- > _validators as $ validator
  8. {
  9. if $バリデーター -> applyTo $シナリオ {
  10. if $ attribute === null || in_array $ attribute $ validator- > attributes true
  11. $バリデーター [ ] = $バリデーター
  12. }
  13. }
  14. $バリデーターを 返し ます。
  15. }

メソッドは、モデル内のルールによって記述されたバリデーターの配列を返します。
ここで興味深い点は、7行目から始まります。 上記のスクリプトについて言及しました。 したがって、ここでは、メソッドCValidator::applyTo($scenario);場合にのみ、バリデーターがチェーンに追加されることがCValidator::applyTo($scenario);
trueを返します。 「on」パラメーターが設定されていない場合、またはバリデーターがモデルが実行されるシナリオを参照する場合にtrueを返します。
どうぞ CModelメソッドを考えてみましょうCModel:createValidators();
$ this- > _validators = $ this- > createValidators ;

本質的に検証ルールの下位レベルおよび最終レベルの分析になります。その後、いくつかの結果をまとめます。

完了間近:CModel :: createValidators()


  1. パブリック 関数 createValidators
  2. {
  3. $ validators = new CList ;
  4. foreach $ this- > rules as $ rule
  5. {
  6. if isset $ rule [ 0 ] $ rule [ 1 ] //属性、バリデーター名
  7. $ validators- > add CValidator :: createValidator $ rule [ 1 ] $ this $ rule [ 0 ] array_slice $ rule 2 )) ;
  8. 他に
  9. throw new CException Yii :: t 'yii' '{class}には無効な検証ルールがあります。ルールは検証する属性とバリデーター名を指定する必要があります。' array '{class}' => get_class $この ;
  10. }
  11. $バリデーターを 返し ます。
  12. }

それで、我々はより低いレベルに到達しました。 このメソッドは、 CModel::rules()説明されている検証ルールの分析を行い、静的クラスメソッドCValidator::createValidator()を使用して、これらのルールで記述された検証オブジェクトを作成します。
CValidator::createValidator()メソッドのAPIを参照し、検証ルールの標準パラメーターを覚えておいてください
  1. 配列
  2. 「モデルフィールドのリスト」
  3. 「バリデーター」
  4. 'on' => 'スクリプト名'
  5. 'メッセージ' => 'エラーメッセージ'
  6. ...検証パラメーター...
  7. ;

、すべてがすぐに所定の位置に収まります。

まとめると


ご覧のとおり、検証規則を解析するアルゴリズムはそれほど複雑なものではありません。 主なことは、問題を理解し、理解したいという欲求を持つことです。 コードがどのように機能するかを理解すると、開発中に何かがうまくいかず、プログラムが正しく実行されない場合に、さまざまな疑問が生じます。

結論として、検証ツールが期待どおりに機能しない場合や、検証ルールが満たされない理由を理解するのに役立ついくつかの機能を要約できます。

Source: https://habr.com/ru/post/J140275/


All Articles