Jump to the content

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

PHP

    さっきから $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 => '名前が設定されていません'
        )
    )
    

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

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

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

    参考

    注目記事

    最近の記事

    ぼくが書いてます

    フロントエンドエンジニア

    イソップ

    ページの先頭に戻る

    Search results

    ×