有没有办法让表单类型容器知道?
例如,我有 3 个实体帐户、用户和事件。用户具有多对多关系,以便将许多用户与许多其他用户(称为批准者)相关联,这样做的原因是用户创建的事件可以具有能够批准它的用户列表。在我有一个批准者多项选择字段的用户编辑表单中,列表需要按帐户过滤,因此我需要我的表单类型是容器感知的,以便按帐户 ID 过滤可用用户列表。
我认为让表单类型容器知道是正确的方法吗?我想使用实体管理器按帐户过滤用户列表。
最佳答案
1 通过构造函数注入(inject)实体管理器
<?php
namespace Acme\YourBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityManager;
class YourType extends AbstractType
{
/**
* The entity manager
*
* @var EntityManager
*/
private $entityManager;
/**
* @param EntityManager
*/
public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
//build your form here
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\YourBundle\Entity\YourEntity',
));
}
public function getName()
{
return 'name_of_your_form';
}
}
2 将其声明为服务
services:
# Form type
acme_your_bundle.name_of_your_form.form.type:
class: Acme\YourBundle\Form\Type\YourType
arguments:
entityManager: "@doctrine.orm.entity_manager"
笔记:
如果您从 Symfony 开始,请接受以下建议:
仔细查看 FOSMessageBundle 的代码,它将为您提供在 symfony 中做任何事情所需的一切,从表单模型到表单工厂,再到创建特殊服务(如 Composer 、授权者等)。你学习这个包越多,你学习 symfony 的速度就越快,我向你保证 100%。最后,在您的具体情况下,查看 FormFactory in this bundle
关于Symfony2 容器感知表单类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21047431/