2017-03-22 7 views
1

私はAPIを構築し、フォームをデータバインディングに使用しています。エンティティのIDを渡して、参照を取得してアイテムに添付したいと思っています。例: ":この値は有効ではありません\ nはERROR" をここで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

「$ event->のgetData() "あなたの実際のエンティティです、もしこのフォームがデフォルトentiオプションのリゾルバで、またはフォームを作成するときにコントローラを介してエンティティを渡した場合に発生します。 (彼らは新しいしている場合)、ユーザーがパスワードを入力する必要があるか、それは必須ではありません場合は、ユーザーがすでに存在する場合かどうかをチェックする。この標準的な方法で同様

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; 
    } 
} 
関連する問題