2017-02-07 28 views
0

Я сам смутился о правильном (или лучшем) способе, чтобы убедиться, что связанные модели отправляются через POST при создании нового пользователя. Оба подхода, приведенные ниже, работают.Как проверить важенную связанную модель в cakephp 3

User hasOne UserDetails 

Вариант 1

POST данные:

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

PatchEntity UserDetail и добавить его в User Entity, как это:

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: если UserDetails не является pr esent на $ this-> request-> data(), объект UserDetails получит ошибки проверки.

Вариант 2 Данные

POST:

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

Добавить user_detail проверки в UserTable.php:

Edit 2: если я не добавляю проверки user_detail, запрос может быть отправлена ​​без соответствующей модели, и она будет сохранена. Добавив его, убедитесь, что в $ this-> request-> data() есть поле user_detail, и объект пользователей, который получит подтверждение.

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

и patchEntity, как это на 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']])) 
    { 
... 

ли эти подходы следующие конвенции торта или есть лучший/чистый способ сделать это?

+0

Вариант 2 - лучший вариант. И это даст вам ошибки проверки как для «Пользователи», так и для соответствующей модели «UserDetails». –

+0

@ObjectManipulator спасибо, что ответили! Фактически в обоих случаях проверка выполняется, потому что проверка выполняется при создании объекта. Основное различие здесь заключается в том, как код написан и отправлены данные :) –

ответ

0

Второй вариант - это правильный вариант по нескольким причинам IMO.

  1. Валидация должна быть на модели, к которой она относится.
  2. Валидация должна быть выразительной и явной. Если я другой парень, читающий этот код, я могу сказать, что для сохранения пользователя требуется подтверждение.
  3. Он более ясен и менее подвержен ошибкам.
  4. Матчи с тортом конвенции. Я не видел ни в одном из их примеров, где вы бы сохранили его, а затем сохранили другое. Saving Associations
+0

Я отредактировал свой вопрос, чтобы было ясно. Оба случая сохраняют данные одновременно; первая добавляет объект UserDetails отдельно. Дело в следующем: заставить UserDetails присутствовать в запросе, должен ли я использовать первый или второй вариант, который я дал? благодаря! –