按所有者/当前用户过滤EntityType

时间:2016-07-05 09:32:04

标签: php symfony

我在表单中有一个EntityType字段:

$builder->add('site')

现在所有网站都显示在下拉列表中,但我只想显示属于当前用户的网站。

应用程序逻辑是有很多用户,每个用户只能管理他们自己的站点(Site :: user是@ORM\ManyToOne(targetEntity="User", inversedBy="sites")

我知道我可以使用query_builder - 但是将当前用户放在表单中的最佳方法是什么?

1 个答案:

答案 0 :(得分: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,
            ]);
    }

现在,您可以在$options['user']中使用buildForm()(请务必在使用之前检查它是否为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();