CakePHP3のHABTMのバリデーションについて
CakePHP2までの場合
こんな感じの非常にまどろっこしい書き方をしないといけなかったですよね。
まぁ、自身のモデルでしかバリデーションはかけられないので当然と言えば当然なんですが・・・
CakePHP3について
結構なんかいい感じのやり方があるものかと思いきや特に見当たらず・・・。
取り合えず
1. CakePHP2と同じようなことをする
2. customValidationでどうにかする
しか思い当らず・・・。
とりあえず1番についてこんな方法でバリデーション自体は実現
※membersテーブルとhobbiesテーブルがhabtm関係
src/Template/Members/add.ctp
echo $this->Form->input('hobbies._ids', ['options' => $hobbies, 'required' => false]);
echo $this->Form->error('hobby');
src/Model/Table/MembersTable.php
<?php
namespace App\Model\Table;
//useは略
class MembersTable extends Table
{
public function initialize(array $config)
{
parent::initialize($config);
$this->table('members');
$this->displayField('name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsToMany('Hobbies', [
'foreignKey' => 'member_id',
'targetForeignKey' => 'hobby_id',
'joinTable' => 'hobbies_members'
]);
}
public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
{
//beforeMarshalで別フィールドに値をセット
//(ちゃんとエラーチェックとかしたほうがいいけど一旦無視
$event->data['data']['hobby'] = $event->data['data']['hobbies']['_ids'];
}
public function validationDefault(Validator $validator)
{
$validator
->add('hobby', ['multiple' => [
'rule' => ['multiple', ['min' => 1]],
'message' => 'hogehoge'
]]);
return $validator;
}
}
まとめ
なんかもっとスマートない方法ないんですかね?