2016-07-05 63 views
1

我有一個的EntityType場的形式:篩選的EntityType /當前用戶

$builder->add('site') 

現在所有的網站都顯示在下拉菜單中,但我想只顯示屬於當前用戶的那些。

該應用程序的邏輯是,有很多用戶,他們每個人只能管理自己的網站(網站::用戶是@ORM\ManyToOne(targetEntity="User", inversedBy="sites")

我知道我可以使用query_builder - 但什麼是最好的方法獲取表單中的當前用戶?

回答

2

要在表單中獲取當前用戶對象(或ID),實際上有多種方式。其中之一是通過表單的選項

$form = $this->createForm(MyFormType::class, $obj, [ 
    'user' => $this->getUser(), 
]); 

進行設置,並能夠與像這樣的默認值null的選項。現在

class MyFormType extends AbstractType 
{ 

    public function configureOptions(OptionsResolver $resolver) 
    { 
      $resolver->setDefaults([ 
        'data_class' => '...', 
        'user' => null, 
      ]); 
    } 

可以在buildForm()內使用$options['user'](請務必檢查它是否null或不使用之前)。


但是這種方式你必須總是自己注入用戶 - 爲什麼不讓Symfony照顧它呢?首先,註冊形式爲服務services.yml像這樣

app.form.myform: 
    class: AppBundle\Form\MyFormType 
    arguments: ["@security.token_storage"] 
    tags: 
     - { name: form.type } 

你看,我已經添加了另一件事:@security.token_storage說法。現在,在你的窗體中添加一個構造函數

use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 

class MyFormType extends AbstractType 
{ 

    protected $tokenStorage; 

    public function __construct(TokenStorageInterface $tokenStorage) 
    { 
      $this->tokenStorage = $tokenStorage; 
    } 

並在buildForm()檢索用戶現在會那麼容易,因爲

$user = $this->tokenStorage->getToken()->getUser(); 
+0

謝謝。通過第一種解決方案,我得到了'用戶'選項不存在。在調用createForm之前,我已經將用戶添加爲$ obj('$ obj-> user = $ this-> getUser()')的屬性。 –

+1

@the_nuts我更新了我的答案,當然您需要啓用選項能夠使用它。 – kero

相關問題