CakePHP2で明示的にバリデーションを行う方法

CakePHP2を使おうと思ったときにおそらく1番最初にやることといえば公式ドキュメントを読んでブログチュートリアルを行うことだと思います。

ただこのブログチュートリアルは、CakePHPってこんなにすごいんだぜ! っていうのを強調したいためか、ある程度自動的にモデルと接続したりバリデーションが出来たりしています。

今回僕が少しつまった部分はバリデーションの部分です。

チュートリアルでは $validate に条件を書けば勝手にバリデーションしてくれますが、実際に運用する場合は自動的にバリデーションを行うというよりはむしろ明示的にバリデーションを行ないたいと思うことも多いと思います。

結論をいうと

Modelの関数であるvalidates()関数を使用する

ことで解決出来ます。

以下に例を示しましょう。

PostsControllerに以下のようなコードが書いてあるとします。

<?php
class PostsController extends AppController {

    public function index(){
        if($this->request->data){
            // ここにバリデーションをかけたあとに色んな処理をしたい
        }
    }

バリデーションをしたいのでモデルにバリデーションを書きます。
ただし今回は自動でバリデーションしないように、Userモデルにバリデーションを書きたいと思います。

<?php
class User extends AppModel {
    public $name = 'User';

    public $validate = array(
        'name' => array(
            'rule' => array('notEmpty'),
            'message' => '空にしないでくださいっ!!'
        )
    );
}

バリデーションに関しては公式ドキュメントを参照してください。

ここに書いたバリデーションをさっき書いたPostsControllerでバリデーションを使用したいとします。
その場合は以下のように書けばUserモデルのバリデーションを使用してバリデーションを行うことが出来ます。

<?php
class PostsController extends AppController {

    public function index(){
        if($this->request->data){
            // ここにバリデーションをかけたあとに色んな処理をしたい
            $this->User = ClassRegistry::init('User');
            if($this->User->validates()){
                // 色んな処理を書く!
            }
        }
    }

この例からわかることは、CakePHPが自動的にやってくれてたことは全て明示的に書くことが出来るということです。

当たり前のことですが、意外とここが理解できなくて苦しむことが多かったです。
また、モデルはデータの入出力、コントローラーはデータの道筋、というMVCの考えがしっかりしていればどこに関数があるかなんとなく検討がつくのかな、と思います。

もし何か質問や相談、ここ違うよ!ってところがあれば以下のコメント欄、またはリプライ(@DAI199)でお願いしますっ