带有相关数据的 symfony 实体表单类型

symfony entity form type with related data

我已经在 symfony2 表单类型中创建了我的表单,我使用了一个实体类型供用户从中选择 his/her 地址,如下所示:

$builder->add('sladdress', 'entity', array(
    'class' => 'myClass\UserBundle\Entity\UserAddresses',
    'property' => 'address',
    'label' => 'label.your_addresses_list',
    'translation_domain' => 'labels',
    'mapped' => false
));

我有一个 UserAddresses 实体,它与用户实体有 ManyToOne 关系并保存用户的地址。 问题仍然是我应该怎么做才能让 sladdress 类型只加载用户拥有的地址?(默认情况下,sladdress 表单字段加载该实体中存在的所有地址) 什么是快速方法?

我找到了解决方案,我们应该像这样使用 symfony 表单类型的 'query_builder' 参数:

$builder->add('sladdress', 'entity', array('class' => 'myClass\UserBundle\Entity\UserAddresses', 'property' => 'address', 'label' => 'label.your_addresses_list', 'translation_domain' => 'labels', 'mapped' => false,
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->where('u.user = ?1')
            ->setParameter(1, $this->context->getToken()->getUser());
    },));

但是我们应该注意的是我们不能在 symfony formTypes 中使用 $this->context 所以我们应该在这个 formType 中创建一个名为 $context 的私有变量,如下所示:

private $context;

然后在此 formType 中创建一个构造函数方法,该方法从调用此表单类型的 $form->createFromBuilder() 的控制器中提供安全上下文:

public function __construct($context)
{
    $this->context = $context;
}

最后,当我们在控制器中调用 FormType 并将 SecurityContext 作为参数传递给它时,如下所示:

    $form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
        'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' =>  $vendor_id)),
    ));