41137
お世話になってます。  
cakephp3のバリデーションについて質問があります。  
※cakephpのバージョンは3.3です。

下記のコードのパスワード入力欄で最小値と最大値の制限をかけたいと考えています。  
しかし、  
minLengthとmaxLengthのバリデーションが通らず、  
そのままテーブルにinsertされてしまいます。  
※notEmptyだけは動いて、空文字の場合はエラーメッセージを表示してくれます。

どのようなことが原因と考えられるでしょうか。

情報が不足しておりましたら申し訳ありませんが、  
言っていただければ追加いたします。

よろしくお願い致します。

add.ctp

```

    <head>
    <?=$this->Html->script('account') ?>
    </head>
    <body>
    <?=$this->Form->create($entity) ?>
    <div>
    <table>
        <tr>
            <td>NAME </td>
            <td>
                <?=$this->Form->text('new_name') ?>
            </td>
        </tr>
        <tr>
            <td>PASSWORD </td>
            <td>
                <?=$this->Form->password('new_pass',['id'=>'t1']) ?>
                <?=$this->Form->error('new_pass') ?>
            </td>
        </tr>
        <tr>
            <td>確認用</td>
            <td>
                <?=$this->Form->password('re_pass',['id'=>'t2']) ?>
            </td>
        </tr>
        <tr>
            <td>性別</td>
            <td>
                <?=$this->Form->select(
                    'sex',
                    array(1=>'男性',2=>'女性')
                ); ?>
            </td>
        </tr>
        <tr>
            <td><?=$this->Form->button('登録',['onclick'=>'return check()']) ?></td>
            <td></td>
        </tr>
    </table>
    <?=$this->Form->end() ?>
    
```

  

UsersController.php  
※使用するfunctionのみ抜粋

```

    public function add() {
        $now = new \DateTime();
        if($this->request->isPost()) {
            $user = $this->Users->newEntity();
            $user->user_name = $this->request->getData(['new_name']);
            $user->password = $this->request->getData(['new_pass']);
            $user->create_date = $now;
            $user->sex = $this->request->getData(['sex']);
            if($this->Users->save($user)) {
                $this->redirect(['action'=>'index']);
            }
        }else{
            $this->set('entity',$this->Users->newEntity());
        }
    
    }
    
```

UsersTable.php

```

    class UsersTable extends Table {
        public function validationDefault(Validator $validator) {
            $validator->notEmpty('new_name');
            $validator
               ->notEmpty('new_pass')
               ->minLength('new_pass',5,'５文字以上で入力してください。')
               ->maxLength('new_pass',10,'10文字以内で入力してください。');
           return $validator;
       }
    }
    
```
CC BY-SA 3.0
2018-01-20T03:59:33.043
41104
2018-02-28T01:21:09.020
2018-01-20T06:01:58.880
13251
13251
question
php cakephp
cakephp3でバリデーションが通らないのですが原因が分かりません
newEntity()するときにバリデーションの処理が動くようです。そのため、検証したいデータを次のように取り出したところうまく動作しました。newEntity($this->request->getData());

もう一点バリデーションが動く箇所はsave()時のようです。このときはvalidationDefaultではない方法を用いるようです。本件については内容と少々外れているので割愛させていただきます。
CC BY-SA 3.0
2018-01-22T14:43:22.607
41137
2018-01-22T14:43:22.607
13251
41104
answer
厳密には、validationDefault()が呼び出されるタイミングは、newEntity(), patchEntity()時です。  
<https://book.cakephp.org/3.0/ja/orm/validation.html#id20>

buildRules()が呼ばれるタイミングは、save(), delete()時です。  
<https://book.cakephp.org/3.0/ja/orm/validation.html#application-rules>

つまり、Entityに対して直接値を設定すると、validationDefaultなどは呼び出されません。

様々なオプションで挙動の調整も可能なので、詳細は上記URLのような公式リファレンスを読むのが早いと思います。
CC BY-SA 3.0
2018-02-28T01:21:09.020
42050
2018-02-28T01:21:09.020
25396
41104
answer