m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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定義しないと呼び出しが難しい
ビヘイビアとの併用が可能かもしれない
定義がなんかややこしいので気をつけておくこと