【CakePHP2】テーブルを使わないがバリデーションしたい場合の方法
CakePHP2で、テーブルを使わないけど、送信データをバリデーションしたい場合などがあると思います。
その場合の処理の方法を忘備録としてポストします。
テーブルのないモデルでバリデーションする
メールアドレスを入力するフォームが1個だけあり、入力されたメールアドレスが正しい書式であるかどうかをチェックするだけのページを例として考えます。
コントローラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
class SamplesController extends AppController { // モデル var $uses = array('Sample'); /** * フォーム * */ function index() { // htmlタイトル $this->set('title_for_layout', 'メールアドレス入力'); } /** * バリデーション * */ function confirm() { // モデルに入力データを渡す $this->Sample->set($this->request->data['email']); // バリデート処理を明確的にコールする $valid = $this->Sample->_register_validation($this->request->data); if ( $valid !== true ) { $this->validateErrors(); $this->render('form'); return; } // フォームへ $this->redirect('./form'); exit; } } |
コントローラーは特に目新しいいことはしていません。
どのモデルを使うか、という指定だけ入れておきます。
モデル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
class Sample extends AppModel { var $name = 'Sample'; public $useTable = false; // DBは使わない // スキーマ public $_schema = array( 'email' => array( 'type' => 'CARCHAR', 'length' => 255, ), ); /** * バリデーション設定 * */ var $validate = array( 'email' => array( array( 'rule' => 'notEmpty', 'message' => '『メールアドレス』を入力してください', 'required' => true, 'allowEmpty' => false, ), array( 'rule' => 'email', 'message' => '『メールアドレス』の書式が不正です', 'required' => false, 'allowEmpty' => true, ), ), ); /** * バリデーション実行 * */ function _register_validation( $data=array() ) { if ( isset($this->data[$this->name]) ) { $data = $this->data[$this->name]; } else { $data = $this->data; } $result = parent::validates($data); if ( $result ) { return true; } return false; } } |
今回の処理で重要なのはこちらのモデル。
上から説明すると、
public $useTable = false; で、DBは使わないという宣言をします。
次にスキーマを作成。
スキーマとは「データベースの構造」という意味の単語。
DBテーブルは使わないのですが、「仮想的にテーブルはこんな型ですよ」と宣言することでバリデーションを可能にする、という感じでしょうか。
あとはいつもの様に、バリデーションをするだけです。
もうちょっとややこしいかと思っていましたが、そんなに難しいことでもないですね。
さすがCakePHP。