新しいユーザーを作成するときに、関連付けられたモデルがPOST経由で送信されていることを確認する正しい方法について混乱しました。以下の両方の方法が有効です。cakephpの必須関連モデルを検証する方法3
User hasOne UserDetails
オプション1
POSTデータ:
{
"username": "loremipsum",
"password": "123456",
"UserDetails": {
"first_name": "Lorem",
"last_name": "Ipsum"
}
}
PatchEntity UserDetailと、このようなユーザエンティティに追加します。場合:
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => [],
'validate' => true
]);
$userDetail = $this->Users->UserDetails->newEntity($this->request->data());
$user->user_detail = $userDetail;
if ($this->Users->save($user, ['associated' =>['UserDetails']]))
{
...
編集1 UserDetails $ this-> request-> data()に存在しない場合、UserDetailsエンティティは検証エラーを受け取ります。
オプション2
POSTデータ:
{
"username": "loremipsum",
"password": "123456",
"user_detail": {
"first_name": "Lorem",
"last_name": "Ipsum"
}
}
UserTable.phpにuser_detail検証を追加します。
編集2:私はuser_detail検証を追加していない場合は、要求を関連するモデルなしで送信することができ、保存されます。これを追加すると、$ this-> request-> data()にuser_detailフィールドがあり、ユーザーエンティティが検証を取得します。 UsersController.php上でこのような
$validator
->requirePresence('user_detail', 'create')
->notEmpty('user_detail');
とpatchEntity:
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => ['UserDetails'],
'validate' => true
]);
if ($this->Users->save($user, ['associated' =>['UserDetails']]))
{
...
Cakeの規則を、以下のこれらのアプローチはありますか、それを行うための最善/きれいな方法がありますか?
オプション2が最適です。そして、それはあなたに 'User'と関連モデル' UserDetails'両方の検証エラーを与えます。 –
@ObjectManipulator返信ありがとうございます!実際にはどちらの場合も、エンティティの作成時に検証が実行されるため、検証が機能します。ここでの主な違いは、コードが書かれデータが送信される方法です。 –