cakephp3で、ユーザーのアカウント登録周りを作っいた時に遭遇したcakephp3ならではの仕様。結構はまって、ネットにも情報がなかったので同じ境遇の人たちの為にメモしておきます。 起きたことは、modelのvalidation機能を使った場合にメッセージだけ表示されないという問題です。 結局teratailさん(https://teratail.com/)に聞いたら速攻返事があって解決できました。coba-cobaさんありがとうございます!! 解決ポイントはViewファイルでした。以下coba-cobaさんからのお言葉です。
$this->Form->textで出力する場合は、バリデーションのメッセージを表示するために$this->Form->errorが必要です。
$this->Form->textは自分でカスタマイズしやすいように用意されています。 一方で、$this->Form->inputで出力する場合は、エラーメッセージは自動で出力してくれます。
基本的には$this->Form->inputを使うと楽です。
参考までに、エラーメッセージが表示されないコードは以下です。signup.phpの$this->Form->textを$this->Form->inputに変えたことで無事にエラーメッセージが出ました!! 英文の公式マニュアルを頑張って読み込んだのにこのことは触れていなかった@_@ signup.php
1 2 3 4 5 6 7 8 9 10 11 |
<?= $this->Form->create($user) ?> <fieldset> <?php echo $this->Form->text( 'name', array( 'maxlength' => '10', 'type' => 'text', 'placeholder'=>'Name', 'required' =>'false')); echo $this->Form->text( 'email', array( 'maxlength' => '255', 'type' => 'email', 'placeholder'=>'Email Address', 'required' =>'false')); echo $this->Form->text( 'password', array( 'maxlength' => '20', 'type' => 'password', 'placeholder'=>'Password', 'required' =>'false')); echo $this->Form->text( 'confirm_password', array( 'maxlength' => '20', 'type' => 'password', 'placeholder'=>'Confirm Password', 'required' =>'false')); ?> </fieldset> <?= $this->Form->button( 'Register', array('name'=>'register', 'class'=>'btn btn-info btn-block')) ?> <?= $this->Form->end() ?> |
Userscontroller.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Controller; use App\Controller\AppController; use Cake\Event\Event; class UsersController extends AppController { public function signup() { $this->viewBuilder()->layout('default'); $user = $this->Users->newEntity(); if ($this->request->is('post')) { $user = $this->Users->patchEntity($user, $this->request->data); if ($this->Users->save($user)) { $this->Flash->success(('The user has been saved. Please check your email, then activate your account.')); return $this->redirect(['action' => 'registered']); } $this->Flash->error(('Unable to add user.')); } $this->set('user', $user); } } |
UsersTable.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; class UsersTable extends Table { public function validationDefault(Validator $validator) { $validator ->requirePresence('name') ->notEmpty('name', 'An Name is required') ->add('name', [ 'maxLen' => [ 'rule' => ['maxLength', 10], 'message' => 'Name is less than 10 characters.', ] ]) ->requirePresence('email') ->add('email', 'validFormat',['rule' => 'email'] ) ->notEmpty('email', 'A email is required') ->requirePresence('password') ->add('password', [ 'comWith' => [ 'rule' => ['compareWith', 'confirm_password'], 'message' => 'The password is incorrect and for confirm_password.', ], 'minLen' => [ 'rule' => ['minLength', 8], 'message' => 'At least eight characters.', ] ]) ->notEmpty('password', 'A password is required') ->requirePresence('confirm_password') ->add('confirm_password', [ // Whether same or for confirmation_password // 'minLen' => [ // 'rule' => ['minLength', 8], // 'message' => 'At least eight characters.', // ] ]) ->notEmpty('confirm_password', 'A confirm_password is required'); return $validator; } } |
LEAVE A REPLY