Php 按所有者/当前用户筛选EntityType
我在表单中有一个EntityType字段:Php 按所有者/当前用户筛选EntityType,php,symfony,Php,Symfony,我在表单中有一个EntityType字段: $builder->add('site') 现在所有的站点都显示在下拉列表中,但我只想显示属于当前用户的站点 应用程序逻辑是有很多用户,每个用户只能管理自己的站点(Site::user是@ORM\manytone(targetEntity=“user”,inversedBy=“sites”)) 我知道我可以使用query\u builder——但是在表单中获取当前用户的最佳方法是什么?要获取表单中的当前用户对象(或id),实际上有多种方法。一种
$builder->add('site')
现在所有的站点都显示在下拉列表中,但我只想显示属于当前用户的站点
应用程序逻辑是有很多用户,每个用户只能管理自己的站点(Site::user是@ORM\manytone(targetEntity=“user”,inversedBy=“sites”)
)
我知道我可以使用
query\u builder
——但是在表单中获取当前用户的最佳方法是什么?要获取表单中的当前用户对象(或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\u 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();
非常感谢。对于第一个解决方案,我得到了选项“user”不存在。
。我已经将user添加为$obj的属性($obj->user=$this->getUser()
,在调用createForm之前)@我已经更新了我的答案,当然你需要启用该选项才能使用它。