ysku's blog

ウェブ・無線通信・組み込みとか

バリデーション【CakePHP2.5】

f:id:yusuke1581:20141112005253j:plain
CakePHPのバリデーションに関するメモ
コントローラにてvalidateを行いたい場合の実装方法です.

Userというモデルがあると仮定しています.
テーブル名:Users
カラム
・name(名前)
・tel(電話番号)
(メモであるため、簡略的に作っています)

使い方
1)ビュー側の実装
フォームを作成します.
test.ctp

// 入力フォームの作成
<?php
    echo $this->Form->create('User', array(
        'type' => 'post',
        'url' => 'test',
        'novalidate' => true,   // HTML5でのバリデーション機能の無効
    ));
?>
<?php
    echo $this->Form->input('name', array(
        'label' => 'name',
        'type' => 'text',
    ));
?>
<?php
    echo $this->Form->input('tel', array(
        'label' => false,    // falseにするとlabelが作成されません
        'type' => 'tel',
    ));
?>
<?php
    $options = array(
        'label' => 'next',
    );
    echo $this->Form->end($options);
?>

2)コントローラ側の実装
だいぶ適当です.
ビューのtest.ctpにてsubmitボタンが押された場合,このコントローラにて処理が行われるようにしています.

<?php
App::users('AppController', 'Controller');

class UsersController extends AppController {

    public function test() {
        if ($this->request->is('post')) {

            // モデルにpostされたデータをセット
            $this->User->set($this->request->data);

            if ($this->User->validates()) {
                // バリデートが成功した場合
            } else {
                // 失敗した場合
            }
        }
    }
}

コントローラでバリデートを行う際に使用するのは,「validates()」です.
ちなみに「validate()」を使用すると,モデルにて設定しているバリデーションの条件の配列が返されます.

3)モデル側の実装

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

class User extends AppModel {

    public $validate = array(
        // 2つの条件を設ける場合
        'name' => array(
            'notEmpty' => array(
                'rule' => 'notEmpty',
                'message' => 'required'
            ),
            'between' => array(
                'rule' => array('between', 1, 20),
                'message' => '20文字以内で入力してください',
            ),
        ),
        // 条件1つのみの場合
        'tel' => array(
            'rule' => 'numeric',
            'message' => '数字を入力してください',
        ),
    );
}

ここでnameやtelで指定しているのですが,これはviewのinputで指定している名前になります.
よくわからないですが,以下のようにviewのinputに別のnameを与えてもvalidateを行えます.

<?php
    echo $this->Form->input('name', array(
        'label' => 'name',
        'type' => 'text',
        'name' => 'hoge',
    ));
?>

また他のモデルを使用するために,以下のようにドット記法を使用してもvalidateが行えるようでした.

<?php
    echo $this->Form->input('Post.name', array(
        'label' => 'name',
        'type' => 'text',
        'name' => 'hoge',
    ));
?>

以上が簡単なメモになります.