HTMLフォームバリデーター

こんにちは、ユーザー名%。



すべてのプログラマーは、少なくとも1回は継承されたコードに出くわしました。 そのようなコードは、「どのようなゴミ|麺| govnokod、書き直そう」という反応を引き起こすことがあります。



これは私が参加したプロジェクトで起こりました。 200〜300行のメソッド、コードの複製、OOPを使用する代わりの手続き型アプローチは、肯定的な感情を引き起こしませんでした。 幸いなことに、PMは非常に適切な人物であることが判明し、リファクタリングの時間を割り当てるという要求を却下しませんでした。 これらのリファクタリングの1つは、最終的に共有したいHTMLフォームを検証するためのプラグインになりました。



このプラグインを作成した理由は、次の形式のコードでした。



if($this->request->data['Model']['field'] > 0) { $this->Session->setFlash(«message»); $this->redirect($this->referer()); } if($this->request->data['Model']['field'] == «string») { $this->Session->setFlash(«message»); $this->redirect($this->referer()); }
      
      







豊富なアクション。 一部のアクションでは、同様のデザインの数が10に達しました。 その結果、アクションロジックは複数のifの背後で完全に失われました。 多くの場合、これらの設計の「コレクション」は、いくつかのアクションやコントローラーで複製されました。 CakePHPを使用している人は、便利なモデルフィールドバリデーターを知っています。 私の場合、モデルのテーブルフィールドに関連付けられていないフォームフィールドが送信されたため、常に直接使用できるとは限りませんでした。



このコードのリファクタリングオプションを検討した後、フォームで送信されるデータのバリデータクラスを作成することにしました。 そのベースとして、ModelValidatorクラスが使用されました。 残念ながら、そのアーキテクチャでは継承を使用できませんでした。 私は古き良き鉱山のペーストを使用しなければなりませんでした。



結果は、次の形式の連想配列をチェックできるクラスです。



 array( 'Model' => array(field_list))
      
      





Validationクラスのすべての機能を使用します。



使用例


HTMLフォーム:



  echo $this->Form->create('Model'); echo $this->Form->input('first_field', array('type' => 'text')); echo $this->Form->input('second_field', array('type' => 'text)); echo $this->Form->end();
      
      







形状クラス:



 App::uses('Form', 'Forms.Lib/Form'); class ExampleForm extends Form { public $model = 'Example'; public $fields = array( 'first_field' => array( 'type' => 'text', ), 'second_field' => array( 'type' => 'text', ) ); public $validate = array( 'second_field' => array( 'isActive' => array( 'rule' => 'isActive', 'message' => "Is fields not active!" ), ), 'first_field' => array( 'aboveZero' => array( 'rule' => 'aboveZero', 'message' => "Number must be greater than 0", ), ), ); /** * @return bool */ public function isActive(){ if(isset($this->options['user_id'])) { return false; } return (bool)$this->data[$this->model]['second_field']; } /** * @return bool */ public function aboveZero() { return (is_numeric($this->data[$this->model]['first_field']) && ($this->data[$this->model]['first_field'] > 0)); } }
      
      







ExampleFormクラスを使用してフォームデータを検証する:



 class ExamplesController extends AppController { public $name = 'Examples'; public $uses = array( 'Example', ); public $components = array( 'Forms.FormValidator' ); public $forms = array( 'ExampleForm', ); /** * Example validation html-form data in $this->request->data */ public function example() { if ($this->ExampleForm->validates($this->request->data)) { echo 'true validations'; } else { echo 'false validation'; } } }
      
      







ExampleFormクラスを使用して連想配列を検証する:



  public function example2() { $data = array( 'Example' => array( 'first_field' => 0, 'second_field' => true ) ); if ($this->ExampleForm->validates($data)) { echo 'true validations'; } else { echo 'false validation'; } }
      
      







ExampleFormクラスを使用して連想配列を検証し、検証用の追加データを渡します。



  public function example3() { $data = array( 'Example' => array( 'first_field' => 0, 'second_field' => true ) ); $this->ExampleForm->addOptions(array('user_id' => $this->Auth->user('id'))); if ($this->ExampleForm->validates($data)) { echo 'true validations'; } else { echo 'false validation'; } }
      
      







計画には、フォームクラスで記述されたフィールドのタイプに基づいた検証ルールの自動追加、さまざまなテンプレートを使用してフォームを表示するためのヘルパーが含まれます。



Githubプラグインコード。



All Articles