【CakePHP】バリデーションエラーの内容をログ表示する

さっきから $model->save() してるんだけど、あれ、保存されない。。

ちょっと待ってください。モデルへの入力値は大丈夫ですか?
もしかしたら、バリデーションで引っかかってエラーが出てるのかもしれませんよ。

こうゆう時のために、デバッグ用にバリデーションのエラーを出力しておくとはかどります。

モデルのvalidationErrors

例えば、モデルの $validate に次のように設定していたとしましょう。

User.php

<?php

public $validate = array(
    'name' => array(
        'notEmpty' => array(
            'rule' => array('notEmpty'),
            'message' => '名前が設定されていません',
            'allowEmpty' => false,
            'required' => true,
        ),
    ),
);

このモデルのデータの保存ができなかった場合、まずバリデーションエラーを疑ってみましょう。
バリデーションのエラーは $model->validationErrors に配列で格納されています。

次のようにコントローラーで出力します。

UsersController.php

<?php

class UsersController extends AppController {
    public function add() {
        if ($this->request->is('post')) {
            $this->User->create();
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash(__('The user has been saved.'));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user data could not be saved. Please, try again.'));

                // saveに失敗したら、バリデーションエラーをログ出力
                debug($this->User->validationErrors);
                // 外部ログファイルに出力することも可能
                $this->log("validationErrors=" . var_export($this->User->validationErrors, true));
            }
        }
    }
}

としてあげて、もしエラーがあれば

array(
    'name' => array(
        (int) 0 => '名前が設定されていません'
    )
)

とログ出力されます。
オーマイガッ、ユーザー登録で名前を忘れるとは何事だっ!

効率よくデバッグするためにはログ大事

ちゃんとログを確認することはデバッグの基本です。
原因がわからなくなったら、ログを確認することで早く問題解決したり、うっかりミスが無くなりますよ。

参考

五十川 洋平(Yohei Isokawa)

五十川 洋平(Yohei Isokawa)

フロントエンドエンジニア/面白法人カヤックなどのWeb制作会社に勤務したのち、故郷の新潟に戻り独立。JSフレームワークAngularやFirebase、Google Cloud Platformを使ったWebアプリ開発が得意。 また、Udemyのプログラミング解説の講師、writer.appの自主開発や上越TechMeetupの主催などを行っています。

プロフィール

©Copyright 2022 Yohei Isokawa All Rights Reserved.