Php symfony实体表单类型及相关数据

Php symfony实体表单类型及相关数据,php,symfony,entity,Php,Symfony,Entity,我已经在symfony2表单类型中创建了我的表单,并且我使用了一个实体类型供用户从中选择其地址,如下所示: $builder->add('sladdress', 'entity', array( 'class' => 'myClass\UserBundle\Entity\UserAddresses', 'property' => 'address', 'label' => 'label.your_addresses_list', 'tran

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

$builder->add('sladdress', 'entity', array(
    'class' => 'myClass\UserBundle\Entity\UserAddresses',
    'property' => 'address',
    'label' => 'label.your_addresses_list',
    'translation_domain' => 'labels',
    'mapped' => false
));
$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());
    },));
    $form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
        'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' =>  $vendor_id)),
    ));
我有一个UserAddresses实体,它与Users实体有多通关系,并保存用户的地址。 问题是,我应该怎么做才能使sladdress类型只加载用户拥有的地址?(默认情况下,sladdress表单字段加载此实体中存在的所有地址)
什么是快速方法?

我找到了解决方案,我们应该使用symfony表单类型的'query\u builder'参数,如下所示:

$builder->add('sladdress', 'entity', array(
    'class' => 'myClass\UserBundle\Entity\UserAddresses',
    'property' => 'address',
    'label' => 'label.your_addresses_list',
    'translation_domain' => 'labels',
    'mapped' => false
));
$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());
    },));
    $form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
        'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' =>  $vendor_id)),
    ));
但是我们应该注意的是,我们不能在symfony formTypes中使用$this->context,所以我们应该在这个formTypes中创建一个名为$context的私有变量,如下所示:

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

public function __construct($context)
{
    $this->context = $context;
}
最后,当我们在控制器中调用FormType并将SecurityContext作为参数传递给它时,如下所示:

$builder->add('sladdress', 'entity', array(
    'class' => 'myClass\UserBundle\Entity\UserAddresses',
    'property' => 'address',
    'label' => 'label.your_addresses_list',
    'translation_domain' => 'labels',
    'mapped' => false
));
$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());
    },));
    $form = $this->createForm(new SelectAddressType($this->get('security.context')), null, array(
        'action' => $this->generateUrl('frontend_order_checkout', array('vendor_code' =>  $vendor_id)),
    ));

为什么要传递整个security.context,而只能从令牌传递用户?此外,您的security-context令牌可以返回一个non。users@DonCallisto是的,我可以从令牌中只传递用户,但我可能需要在上下文中传递其他内容future@Mohammad:“在未来”。。。如果您不确定,请不要通过整个security.context,这不是一个好做法;)