cakephp3【alpha1】のバリデーション3
内部メソッド内をバリデーションルールとして使用
この方法を使うことでビヘイビアと併用できるため
実装
サンプル
<?php namespace App\Console\Command; use Cake\Console\Shell; use Cake\Validation\Validator; /** * Sample3 shell command. */ class Sample3Shell extends Shell { /** * main() method. * * @return bool|int Success or error code. */ public function main() { // バリデータオブジェクト生成 $validator = new Validator(); // 定義設定 $validator ->validatePresence('name') ->add('name', 'custom1', [ 'rule' => [ 'rule1' => [$this, 'check1'] ], 'message' => 'なんかおかしいよ???' ]) ; // チェック $data = [ 'name' => 'aaa', 'age' => '50' ]; // チェック $errors = $validator->errors($data); var_dump($errors); } // publicで定義しないとcheckがうまく動かない… public function check1($context){ if($context != 100){ return false; } return true; } }
結果
[vagrant@localhost alpha1]$ sh app/src/Console/cake sample3 Welcome to CakePHP v3.0.0-alpha1 Console --------------------------------------------------------------- App : src Path: /vagrant/projects/alpha1/app/src/ --------------------------------------------------------------- array(1) { 'name' => array(1) { 'custom1' => string(33) "なんかおかしいよ???" } } [vagrant@localhost alpha1]$
※ん。一応こんな感じ
疑問
ドキュメントにはこんな書き方
// Use an array callable that is not in a provider $validator->add('title', 'custom', [ 'rule' => [$this, 'method'] ]);
↓
今回
->add('name', 'custom1', [ 'rule' => [ 'rule1' => [$this, 'check1'] ], 'message' => 'なんかおかしいよ???' ])
※ruleの中にキーをもう1つ設定してしていないと動かない感じだったのでこうした…
validatorのaddメソッドを確認
public function add($field, $name, $rule = []) { $field = $this->field($field); if (!is_array($name)) { $rules = [$name => $rule]; } else { $rules = $name; } foreach ($rules as $name => $rule) { $field->add($name, $rule); } return $this; }
んーーーーー?
$fieldが”name”、$nameが"custom1"だから$ruleにはrule1 => [$this, 'check1']が入るはず。
で$field->addの場合に$ruleに[$this, 'check1']を渡さないといけない感じ
もう1つの方法があるみたいですけど基本的にはテーブルもしくはビヘイビアで使うのでこの辺りにしておく
独自バリデートも捨てがたいけど既存のもので対応できるし、そんなに管理しないだろうしいらないかな
まとめ
メソッドでのバリデートロジック使用ははpublic定義しないと呼び出しが難しい
ビヘイビアとの併用が可能かもしれない
定義がなんかややこしいので気をつけておくこと