2013-01-03 2 views
0

3 개의 레이어가있는 양식이 있습니다.양식을 제출하지 않고 엔티티가 저장되지 않고 저장됩니다.

내장 된 유효성 검사는 어떻게 든 3 가지 레벨 모두를 통해 트리거되지 않습니다. 따라서 세 번째 레벨에서 오류를 수동으로 확인해야합니다. 오류가 발견되면 오류가있는 엔티티가 지속되지 않습니다. 플러시는 항상 루프가 끝날 때 트리거됩니다. 불행히도 유지되지 않고도 일부 잘못된 엔터티가 데이터베이스에 저장됩니다. 내 컨트롤러는 다음과 같습니다.

$form = $this->createForm(new GameListType(), $betRound); 

    $request = $this->getRequest(); 
    if ($request->getMethod() == 'POST') { 
     $form->bind($request); 
     $betRound = $form->getData(); 
     if ($form->isValid()) { 
      foreach ($betRound->getGames() as $game) { 
       if ($game->hasBet()) { 
        $bet = $game->getBet(); 
        // Filter are used during select 
        // , but dont work for inserts 
        // should work in this current context! 
        $bet->setGame($game); 
        $bet->setBetRound($betRound); 
        $bet->setUser($user); 

        $validator = $this->container->get('validator'); 
        $errors = $validator->validate($bet); 
        if (count($errors) == 0) { 
         print($bet. ' got persisted'); <-- never triggered 
         $em->persist($bet); 
        } else { 
         // Manual Error Handling 
         // (no cascade Validation to third level 
         foreach ($errors as $violation) { 
          $form->addError(new FormError(
                $violation->getMessageTemplate(), 
                $violation->getMessageParameters(), 
                $violation->getMessagePluralization() 
            )); 
         } 
        } 
       } 
      } // foreach ($betRound->getGames() as $game) 
      $em->flush(); 

      if(!$form->hasErrors()){ 
       return $this->redirect($this->generateUrl('betround_show', 
         array('id' => $betRound->getId()) 
         )); 
      } 
     } 

지속 작업은 실행되지 않지만 유효하지 않은 $ bet 엔티티는 여전히 데이터베이스에 저장됩니다.

+0

당신을 위해 그것을 할 수있는 LifeCycleArgs가 있습니까? – phpisuber01

+0

내가 아는 바는 아니지만 지속 된 후에 내기 엔티티에 수정 사항을 추가 할 수있는 몇 가지 방법이 있지만 내기가 처음부터 지속되는 위치는 여전히 알 수 없습니다. – m0c

답변

2

게임과 내기의 관계에 계단식 옵션이 있는지 확인하십시오.

정말 문제가 지속 되었습니까 아니면 업데이트입니까? 베팅은 이미 존재하며 유효성 검사가 실패하면 변경 사항을 업데이트하지 않으려 고합니다. 그렇다면 $ em-> refresh ($ bet)를 사용하여 유효성 검사가 실패 할 때 변경 사항을 실행 취소해야합니다.

+0

이 경우 해당 업데이트를 방지하고 싶습니다. 계단식 옵션이 왜 중요한가요? 내 게임 엔티티도 계단식으로 연결하지 마십시오. 나는 새로 고침을 시도 할 것이다, 그러나 나는 아직도 모르지만, 왜 내기가 처음부터 changeset에 도착하는지. – m0c

+0

$ bet-> setGame()으로 변경하기 때문에 바뀝니다. 마찬가지로, 내기가 폼에 나타나면 $ form-> bind도 그것을 바꿀 것입니다. 새로 고침은 데이터베이스에서 원래 내기를 다시로드하고 문제를 처리해야합니다. – Cerad

+1

지연된 명시 적 변경 내용 추적 정책을 사용할 수도 있습니다. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/change-tracking-policies.html. 업데이트 할 개체를 유지해야합니다. 그러나 당신은 아마 그것을하고 싶지 않습니다. – Cerad