Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

cakephp3 での custom validation についてと,ちょっとした tips

cakephp3 での custom validation についてと,ちょっとした tips みたいなものを.

基本的にはドキュメントに書いて有るとおりですが,ドキュメントになさそうなことを少し.

custiom valudation ですが,

$validator->add('title', 'custom', [
    'rule' => function ($value, $context) use ($extra) {
        // Custom logic that returns true/false
    }
]);

と書くと書かれていますが,2番目の引数の "custom" って何じゃラホイって思ったら error() 時の配列の key のようですね.

$errors = $validator->errors();

で得られる $errors 配列に $errors['hoge']['custom']['message'] と入っているみたいです.まぁ,自分でエラーメッセージ表示する時にはちょっと意識しないとダメかもしれないけど,FormHelper 使ってエラーメッセージ表示する分には意識することはなさそうかな.

あと,たとえばユーザ登録とかで

$user = $this->Users->newEntity();
if ($this->request->is('post')) {
    // patchEntity 関数で validation 実行
    $user = $this->Users->patchEntity($user, $this->request->data);
    if (!$user->errors()) {
        // save
    }
}
else {
    $this->set(compact('user'));
}

とやると validation メッセージが表示されないです.post 時に $user に errors が追加された物が template 側に渡されないからですね.post 時にも validation 後の $user を渡すように

$user = $this->Users->newEntity();
if ($this->request->is('post')) {
    // patchEntity 関数で validation 実行
    $user = $this->Users->patchEntity($user, $this->request->data);
    if (!$user->errors()) {
        // save
    }
}
$this->set(compact('user'));

として else の外に置いておく必要があるですね.