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?
Option 2 ist eine bessere Option. Und es gibt Ihnen Validierungsfehler für "Benutzer" und das zugehörige Modell "UserDetails". –
@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 :) –