2017-02-07 11 views
0

新しいユーザーを作成するときに、関連付けられたモデルが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の規則を、以下のこれらのアプローチはありますか、それを行うための最善/きれいな方法がありますか?

+0

オプション2が最適です。そして、それはあなたに 'User'と関連モデル' UserDetails'両方の検証エラーを与えます。 –

+0

@ObjectManipulator返信ありがとうございます!実際にはどちらの場合も、エンティティの作成時に検証が実行されるため、検証が機能します。ここでの主な違いは、コードが書かれデータが送信される方法です。 –

答えて

0

第2のオプションは、いくつかの理由からIMOの正しいオプションです。

  1. 検証は、関係するモデル上で行う必要があります。
  2. 検証は表現力豊かで明示的でなければなりません。私がこのコードを読んでいる他の人であれば、ユーザーを保存するために検証が必要であると言えるでしょう。
  3. エラーがより明確になりやすくなります。
  4. ケーキのコンベンションに一致します。私はあなたが1つを保存し、次にもう1つを保存する例では見ていません。 Saving Associations
+0

私は質問を明確にするために編集しました。どちらの場合も、データは一度に保存されます。最初のものはUserDetailsエンティティを別々に追加するだけです。事は:私が与えた最初または2番目のオプションを使用する必要がありますUserDetailsを強制的に要求に存在する?ありがとう! –

関連する問題