我在表单中有一个EntityType字段:
$builder->add('site')
现在所有网站都显示在下拉列表中,但我只想显示属于当前用户的网站。
应用程序逻辑是有很多用户,每个用户只能管理他们自己的站点(Site :: user是@ORM\ManyToOne(targetEntity="User", inversedBy="sites")
)
我知道我可以使用query_builder
- 但是将当前用户放在表单中的最佳方法是什么?
答案 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();