2016-07-05 38 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

相关问题