2017-03-29 30 views
2

我正在構建使用Symfony 3 Forms,並且需要檢索依賴於當前用戶的集合,並在下拉列表中呈現該表單。Symfony 3:將變量傳遞到表單

使用EntityType我可以檢索所有實體的列表,但我希望能夠運行自定義查詢,該查詢只檢索那些與當前用戶對象具有關係的查詢。

我已閱讀表單和EntityType的文檔,它解釋了作爲參數傳遞集合中的自定義查詢和提及。但是我無法找到有關如何在任何地方實現的說明。

理想情況下,我想要傳遞一個我在Controller中策劃的集合,傳入User對象以在窗體中運行查詢,或以其他方式訪問窗體中的用戶ID以運行查詢上。

有沒有人找到類似的解決方案?

回答

5

你應該

通在用戶對象試圖運行表內的查詢

  1. 定義所需參數useroptions resolver

    public function configureOptions(OptionsResolver $resolver) 
    { 
        // ... 
        $resolver->setRequired('user'); 
        // type validation - User instance or int, you can also pick just one. 
        $resolver->setAllowedTypes('user', array(User::class, 'int')); 
    } 
    

它會強制你通過user選項,所以你不會忘記它。

  1. 將用戶實例或用戶ID作爲選項傳遞給表單。

在控制器它可能看起來像這樣:

$this->createForm(SomeFormType::class, $underlyingObjectOrNull, array(
    'user' => $this->getUser(), 
)); 
  • 構建custom query for EntityType字段:

    $user = $options['user']; 
    $builder->add('someField', EntityType::class, array(
        'class' => 'AppBundle:SomeEntity', 
        'query_builder' => function (EntityRepository $er) use($user) { 
         return $er->createQueryBuilder('u') 
          //.. -> some method building the query builder 
        }, 
    )); 
    
  • 請注意use($user)部分這使您可以訪問匿名函數中的此變量。

    +0

    這工作就像一個魅力。非常感謝! – Mrshll1001

    0

    下面介紹如何將自定義集合傳遞給表單。例如:

    例如:產品實體;

    內部控制

    $form = $this->createForm(ProductType::class, $product, array('recommended_product' => $recommendedProduct)); 
    

    內FormType

    $builder 
        ->add('recommended_product', EntityType::class, array(
          'class' => 'AppBundle\Entity\Product', 
          'choices' => $options['recommended_product'], 
          'choice_label' => function (Product $user) { 
           return $user->getProduct(); 
          } 
         )); 
    
    public function configureOptions(OptionsResolver $resolver) 
    { 
        $resolver->setDefaults(array(
         'data_class' => 'AppBundle\Entity\Product', 
         'recommended_product' => array() 
        )); 
    } 
    
    +0

    注意:我使用產品實體而不是用戶所要求的用戶 –