m_shige1979のときどきITブログ

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

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

https://github.com/mshige1979

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()でエラー情報を取得


今回はここまで