m_shige1979のときどきITブログ

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

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

https://github.com/mshige1979

cakephp3でTableに定義しないで独自にvalidateを行う

Tableの定義の場合のバリデーションでは…

そのクラスに置かれてしまう感じがする。別にそれでもいいかもしれないけど別途validateのチェックを行う際などに役に立つかも

サンプル

shellでの簡易記述
<?php
namespace App\Console\Command;

use Cake\Console\Shell;
use Cake\Validation\Validator;

/**
 * Sample1 shell command.
 */
class Sample5Shell extends Shell {

/**
 * main() method.
 * 任意のバリデータを生成し、チェックする
 * TableオブジェクトやEntityが不要なバージョン
 *
 * @return bool|int Success or error code.
 */
	public function main() {

        // バリデータオブジェクト生成
        $validator = new Validator();

        // 定義設定
        $validator
            ->validatePresence('name')
            ->notEmpty('name', [
                'message' => 'nameが未設定'
            ])
        ;
        // チェック
        $data = [
            'name' => ''
        ];
        // チェック
        $errors = $validator->errors($data);
        var_dump($errors);

        // チェック
        $data = [
            'name' => 'hoge'
        ];
        // チェック
        $errors = $validator->errors($data);
        var_dump($errors);

	}
}
結果
$ sh app/App/Console/cake sample5

Welcome to CakePHP v3.0.0-dev3 Console
---------------------------------------------------------------
App : App
Path: /vagrant/projects/cakephp3-sample/05_shell/app/App/
---------------------------------------------------------------
array(1) {
  'name' =>
  array(1) {
    [0] =>
    array(1) {
      'message' =>
      string(16) "nameが未設定"
    }
  }
}
array(0) {
}
[vagrant@localhost 05_shell]$

手順

validateオブジェクト生成
        // バリデータオブジェクト生成
        $validator = new Validator();

※オブジェクトを生成

使用項目の定義
            ->validatePresence('name')

※使用する項目を一意の名称で設定

validatePresenceで設定したキーでvalidateを実施
            ->notEmpty('name', [
                'message' => 'nameが未設定'
            ])

※それぞれのチェックをチェーンメソッド形式で設定

データを定義
        // チェック
        $data = [
            'name' => ''
        ];

連想配列で上記で設定したキーと同じ値であること。今まではdata[Users][name]みたいな感じだったけど変更されたみたい。

チェック
$errors = $validator->errors($data);

※チェック結果が$errors配列へ返されます。

まとめ

バリデーションを規定のテーブルやエンティティなどを使用せずにチェックしたい場合の方法です。バリデーションを各Tableで管理しないで独自のクラスなどで管理したい場合などはこちらの方が便利かもしれませんね。
ちょっとバリデーションの種類や独自バリデーションルールの作成もいろいろ調べてみようかな。

MVCのことは書かんけどね。ボロクソ言われそうで怖いしw。