2017-02-07 2 views
0

Ich habe mich verwirrt über die richtige (oder beste) Möglichkeit, um sicherzustellen, dass die zugeordneten Modelle per POST beim Erstellen eines neuen Benutzers gesendet werden. Beide unten aufgeführten Ansätze funktionieren.Gewusst wie: Überprüfen obligatorisch zugeordnetes Modell in CakePHP

User hasOne UserDetails 

Option 1

POST-Daten:

{ 
    "username": "loremipsum", 
    "password": "123456", 
    "UserDetails": { 
     "first_name": "Lorem", 
     "last_name": "Ipsum" 
    } 
} 

PatchEntity UserDetail und fügen Sie Benutzer Entity wie folgt aus:

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']])) 
    { 
... 

Edit 1:, wenn die Nutzerdetails nicht in der $ this-> request-> data() vorhanden ist, wird die UserDetails-Entität Validierungsfehler erhalten.

Option 2

POST-Daten:

{ 
    "username": "loremipsum", 
    "password": "123456", 
    "user_detail": { 
     "first_name": "Lorem", 
     "last_name": "Ipsum" 
    } 
} 

hinzufügen user_detail Validierung in UserTable.php:

Edit 2: wenn ich user_detail Validierung nicht hinzufügen, die Anfrage kann ohne das zugehörige Modell gesendet werden und es wird gespeichert. Durch das Hinzufügen wird sichergestellt, dass auf $ this-> request-> data() ein user_detail-Feld vorhanden ist und die Users-Entität die Validierung erhält.

$validator 
    ->requirePresence('user_detail', 'create') 
    ->notEmpty('user_detail'); 

und patchEntity wie diese auf UsersController.php:

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']])) 
    { 
... 

Sind diese Ansätze Konventionen der folgenden Kuchen oder gibt es eine beste/saubere Art und Weise, es zu tun?

+0

Option 2 ist eine bessere Option. Und es gibt Ihnen Validierungsfehler für "Benutzer" und das zugehörige Modell "UserDetails". –

+0

@ObjectManipulator danke für die Antwort! In beiden Fällen funktioniert die Validierung, da die Validierung beim Erstellen der Entität ausgeführt wird. Der Hauptunterschied hier ist die Art, wie Code geschrieben und Daten gesendet wird :) –

Antwort

0

Die zweite Option ist die richtige Option aus ein paar Gründen IMO.

  1. Die Validierung sollte auf dem Modell erfolgen, zu dem es gehört.
  2. Validierung sollte ausdrucksvoll und explizit sein. Wenn ich der andere bin, der diesen Code liest, könnte ich sagen, dass die Validierung zum Speichern eines Benutzers erforderlich ist.
  3. Es ist klarer und weniger anfällig für Fehler.
  4. Übereinstimmungen mit Kuchenkonvention. Ich habe in keinem ihrer Beispiele gesehen, wo Sie einen retten und dann den anderen retten würden. Saving Associations
+0

Ich habe meine Frage bearbeiten, um es klar zu machen. In beiden Fällen werden die Daten sofort gespeichert. Der erste fügt die Entität UserDetails separat hinzu. Die Sache ist: um UserDetails zu zwingen, auf der Anfrage anwesend zu sein, sollte ich die erste oder zweite Option benutzen, die ich gegeben habe? Vielen Dank! –

Verwandte Themen