libro
www.tuyano.com
初心者のためのCakePHP2 プログラミング入門

バリデーションを使おう! (5/5)

作成:2011-12-12 08:07
更新:2011-12-12 08:23

■オリジナル・バリデーションを定義する

用意されているバリデーションにはない、独自のチェックを行いたいような場合、バリデーションの定義を自分で作成して利用することができます。

バリデーションの’rule’には、Modelクラスに定義したメソッド名を指定することができます。これにより、そのメソッドを呼び出してバリデーションを行わせることができるのです。このメソッドは、以下のような形で定義されます。
function メソッド名(値,引数,……){
    ……実行する処理……
    return 真偽値;
}
メソッドには最低でも1つの引数が用意されます。この第1引数には、バリデーションを設定したフォーム項目の値が収められます。――と、CakePHPのドキュメントにはあるのですが、現在の安定版であるCakePHP 2.0.4stableで確認しても、この引数には「入力された値」は入りません。何が入るかというと、「項目名をキーとして、入力された値を保管した連想配列」が入っています。

例えば、”helo”という項目にバリデーション・メソッドを割りつけたとすると、第1引数には、array(‘helo’=>値)といった配列が入っています。ですので、この配列から値を取り出して処理する必要があります。

(※CakePHPのサイトにある2.0正規ドキュメントでは値がそのまま渡されるように記述されており、掲載されているサンプルコードもそのようになっています。ですので、これはバグの可能性があり、いずれ修正されるかも知れません。今後のバージョンアップをチェックしてください。)

さて、第2引数以降には、’rule’で指定した際に用意するオプション設定が渡されます。つまり、’rule’=>array(メソッド名,オプション1,オプション2,……)というように記述すると、このオプション1以降が、バリデーションメソッドの第2引数以降に渡される、というわけです。

メソッドは、必ず真偽値をreturnします。trueを返すとチェックOK、falseだとチェックに失敗したことを意味します。これでバリデーションの結果を伝えるわけですね。

サンプルとして、簡単なバリデーションを作ってみました。checkMyRuleは、第2引数で指定した値で割り切れる数字のみ受け付けます。ここでは'rule'=>array('checkMyRule',2)と設定し、偶数の値のみ受け付けるようにしてみました。実際に動かして動作を確認してみましょう。こんな具合に、簡単にオリジナルのバリデーションが作成できると、バリデーションの幅も広がりますね。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※MySampleData.php

<?php
App::uses('AppModel', 'Model');

class MySampleData extends AppModel {
  
  public $validate = array(
    'name'=>array(……略……),

    'mail'=>array(
      'rule'=>array('checkMyRule',2),
      'message'=>'偶数を入力ください。'
    ),

    'tel'=>array(……略……)
  );
  
  function checkMyRule($val,$num){
    $n = $val['mail'];
    return $n % $num == 0;
  }
}

※関連コンテンツ

「初心者のためのCakePHP2 プログラミング入門」に戻る