2017-02-07 3 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 :은 if 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 필드가 있고 사용자 엔티티이 유효성을 확인할 것입니다.

$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가 더 좋습니다. 그리고'User'와 관련 모델'UserDetails' 모두에 대해 유효성 검사 오류를 줄 것입니다. –

+0

@ObjectManipulator 답장을 보내 주셔서 감사합니다! 실제로 엔티티를 만들 때 유효성 검사가 실행되므로 두 경우 모두 유효성 검사가 작동합니다. 가장 큰 차이점은 코드 작성 및 데이터 전송 방법입니다. –

답변

0

두 번째 옵션은 IMO의 몇 가지 이유로 올바른 옵션입니다.

  1. 유효성 검사는 해당 모델에 적용되어야합니다.
  2. 유효성 검사는 명시적이고 명시 적이어야합니다. 이 코드를 읽는 다른 사람이라면 사용자 저장에 유효성 검사가 필요하다는 것을 알 수 있습니다.
  3. 더 명확하고 오류가 적습니다.
  4. 케이크 규칙과 일치합니다. 나는 당신이 하나를 살리고 다른 하나를 구할 그들의 예에서 보지 못했습니다. Saving Associations
+0

명확하게하기 위해 제 질문을 수정했습니다. 두 경우 모두 데이터가 한 번에 저장됩니다. 첫 번째 것은 UserDetails 엔티티를 별도로 추가합니다. 것은 : 제가 주어진 첫 번째 또는 두 번째 옵션을 사용해야 UserDetails가 요청에 강제로 존재합니까? 감사! –