2017-03-22 61 views
1

我正在構建一個API並使用表單進行數據綁定,現在我希望能夠傳遞一個實體的ID,獲取引用並將其附加到該項目,這裏是一個例子:Symfony3表單類型,通過編號參考其他實體

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; 
    }); 
} 

這將返回 「錯誤:這個值是無效\ n」。

這裏是我的測試要求:

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

回答

1

的「$事件 - >的getData() 「是你實際的實體,如果這個表單使用默認的enti ty在其選項解析器中,或者如果您在製作表單時通過控制器傳遞實體。

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將採取的數據格式,並將其轉換成另一種格式(類型)。

什麼,你可以使用一個ViewTransformer,在Transform()階段,將採取實體和返回其id而在ReverseTransform()它採用id,並通過使用一個倉庫,將檢索實體。

喜歡的東西

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; 
    } 
}