cakephp3でのバリデート
少しずつチェック
1日ごとだとあまりまとめられないけど忘れるとまずいしちょっとずつメモ目的で…
Tableオブジェクト
デフォルトの処理は"validationDefault"を定義してチェックする
app/App/Model/Table/MembersTable.php
<?php namespace App\Model\Table; use Cake\ORM\Table; use Cake\Validation\Validator; /** * Members Model */ class MembersTable extends Table { /** * Initialize method * * @param array $config The configuration for the Table. * @return void */ public function initialize(array $config) { $this->table('members'); $this->displayField('name'); $this->primaryKey(['id']); $this->addBehavior('Timestamp'); } /** * Default validation rules. * * @param \Cake\Validation\Validator $validator * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator) { $validator ->add('id', 'valid', ['rule' => 'numeric']) ->allowEmpty('id', 'create') ->allowEmpty('name') ->add('age', 'valid', ['rule' => 'numeric']) ->allowEmpty('age') ->allowEmpty('tel'); return $validator; } // 独自のバリデーション public function validationCustom1(Validator $validator) { $validator ->validatePresence('name') ->notEmpty('name', 'nameが未入力') ->add('name', [ 'length' => [ 'rule' => ['minLength', 10], 'message' => 'nameを10文字以上入力', ] ]) ; return $validator; } }
app/App/Model/Entity/Member.php
<?php namespace App\Model\Entity; use Cake\ORM\Entity; /** * Member Entity. */ class Member extends Entity { /** * Fields that can be mass assigned using newEntity() or patchEntity(). * * @var array */ protected $_accessible = [ 'name' => true, 'age' => true, 'tel' => true, ]; }
※こちらは基本的に変更はない
サンプル
<?php namespace App\Console\Command; use Cake\Console\Shell; use Cake\ORM\TableRegistry; /** * Sample1 shell command. */ class Sample4Shell extends Shell { /** * main() method. * * @return bool|int Success or error code. */ public function main() { // Tableオブジェクト生成 $members = TableRegistry::get('Members'); // エンティティを生成 $member = $members->newEntity([ 'name' => "", 'age' => "", 'tel' => "" ]); // バリデーション $result1 = $members->validate($member); var_dump($member->errors()); // エンティティを生成 $data = [ 'name' => "123456789", 'age' => "aa", 'tel' => "aa" ]; $member = $members->newEntity($data); // バリデーション $result2 = $members->validate($member, [ 'validate' => 'custom1' // MembersテーブルのvalidationCustom1をチェックに使用 ]); var_dump($result2); var_dump($member->errors()); } }
結果
[vagrant@localhost 05_shell]$ sh app/App/Console/cake sample4 Welcome to CakePHP v3.0.0-dev3 Console --------------------------------------------------------------- App : App Path: /vagrant/projects/cakephp3-sample/05_shell/app/App/ --------------------------------------------------------------- array(0) { } bool(false) array(1) { 'name' => array(1) { 'length' => string(27) "nameを10文字以上入力" } } [vagrant@localhost 05_shell]$
Tableオブジェクトクラスに"validationCustom1"として、
$result2 = $members->validate($member, [ 'validate' => 'custom1' // MembersテーブルのvalidationCustom1をチェックに使用 ]);
のようにvalidateの第2引数に指定することで任意のバリデーションを使用することが可能(通常はdefault)
まとめ
- Tableオブジェクトにバリデーションを定義
- バリデートする際は基本、エンティティが必要
- valiate()でチェック
- errors()でエラー情報を取得
今回はここまで