2017-03-22 1 views
1

API를 만들고 데이터 바인딩을 위해 양식을 사용하고 있습니다. 이제 엔티티의 ID를 전달하고 참조를 가져 와서 항목에 첨부 할 수 있기를 원합니다. 예 : ":이 값은 유효하지 않습니다 \ n 오류가."여기 Symfony3 폼 유형, id로 다른 엔티티 참조

내 테스트 요청입니다 :

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('credit'); 
    $builder->add('currency', 'currency'); 
    $builder->add('borrower', BorrowerType::class, [ 
     'required' => true 
    ]); 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
     $data = $event->getData(); 
     $borrower = $this->em->getReference(Borrower::class, $data['borrower']); 
     $data['borrower'] = $borrower; 
    }); 
} 

이 반환

$client->request('POST', $endpoint, [ 
     'loan' => [ 
      'credit' => '1000', 
      'currency' => 'EUR', 
      'borrower' => $borrower->getId() 
     ] 
    ]); 

답변

1

은 "$ 이벤트 -> GetData의() "이 양식이 기본 엔티를 사용하는 경우 실제 엔티티입니다. 옵션 리졸버에서 또는 폼을 만들 때 컨트롤러를 통해 엔티티를 전달하면됩니다. (그들은 새로운 인 경우) 사용자가 암호를 입력해야하거나이 필요하지 않다면 사용자가 이미 존재하는 경우 여부를 확인의 표준 방식처럼

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('credit'); 
    $builder->add('currency', 'currency'); 
    $builder->add('borrower', BorrowerType::class, [ 
     'required' => true 
    ]); 

    $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) { 
     $entity = $event->getData(); 

     //The following doesn't make a lot of sense 
     //The borrower will already be set 

     $borrower = $this->em->getReference(Borrower::class, $entity->getBorrower()); 
     $entity->setBorrower($borrower); 
    }); 
} 

.

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     $user = $event->getData(); 
     $form = $event->getForm(); 
     $formParams = [ 
      'type' => PasswordType::class, 
      'first_options' => ['label' => 'Password'], 
      'second_options' => ['label' => 'Repeat Password'], 
     ]; 

     if ((!$user || null === $user->getId())) { 
      $formParams['constraints'] = new NotBlank(); 
     } else { 
      $formParams['required'] = false; 
     } 

     $form->add('plainPassword', RepeatedType::class, $formParams); 
    }); 

이 양식이 엔티티를 생성 또는 업데이트하는 경우 차용 정보는 엔티티가 생성 될 때 엔티티로 설정됩니다.

1

한 가지 간단한 방법은 "symfonic"방법은 데이터 형식을 다른 형식 (타입)으로 변환하는 DataTransformer

DataTransformer를 사용하는 것입니다이 도달합니다.

은 당신이 사용할 수있는 것은 Transform() 단계에서 기업을하고 idReverseTransform()에이 id을 소요하고, 저장소를 사용하여 검색하는 반면 엔티티가 반환하는 ViewTransformer입니다.

뭔가

같은
class BorrowerToIdTransform implements DataTransformerInterface 
{ 
    private $manager; 

    public function __construct(ObjectManager $manager) 
    { 
     $this->manager = $manager; 
    } 

    /** 
    * Transforms an object (Borrower) to a string (id). 
    * 
    * @param Borrower|null $issue 
    * @return string 
    */ 
    public function transform($borrower) 
    { 
     if (null === $borrower) { 
      return ''; 
     } 

     return $borrower->getId(); 
    } 

    /** 
    * Transforms a string (id) to an object (Borrower). 
    * 
    * @param string $id 
    * @return Borrower|null 
    * @throws TransformationFailedException if object (issue) is not found. 
    */ 
    public function reverseTransform($id) 
    { 
     if (!$id) { 
      return; 
     } 

     $borrower = $this->manager 
      ->getRepository(Borrower::class) 
      ->find($id) 
     ; 

     if (null === $borrower) { 
      throw new TransformationFailedException(sprintf(
       'A borrower with "%s" id does not exist!', 
       $id 
      )); 
     } 

     return $issue; 
    } 
}