在表单中包含不相关实体子集的"正确"方法是什么?



想象三个实体 - 帐户,地址,购买。帐户与地址具有一对多关系。购买与帐户相关,但与地址无关 - 但是它确实有一个地址的文本字段(这是因为地址可以更改,我不希望地址直接相关)。在用户帐户页面上,他们可以添加地址。登录到站点时,购买 ID 存储在会话中,并用于在需要时检索购买详细信息。

我想在结帐页面上显示用户当前在<选择>中拥有的所有地址的列表,允许他们选择一个地址,并更新当前购买中的地址。 $account->getAddresses() 存在,将显示与用户相关的地址。

我已经阅读了 http://symfony.com/doc/current/reference/forms/types/collection.html 和 http://symfony.com/doc/current/cookbook/form/form_collections.html,但看不到如何将其应用于这种情况,尽管嵌入式表单并不是真正必要的 - 我不想在那个阶段更改购买的其他细节。

所以我的问题是(至少是其中之一):如何将 $account->getAddresses() 的结果传递给表单类型?或者在表单类型中,我是否应该使用实体字段类型,如果是这样,如何获取自定义query_builder以在表单类型中包含当前用户?或者我应该怎么做?

您需要将实体传递给 Type 的构造函数,然后使用它来获取参数。

Class YourType extends AbstractType
{
    private $account;
    public function __construct($account)
    {
        $this->account = $account;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $accountId = $account->getAccountId();
        $builder->add('addressId', 
                      'entity', 
                       array('class' => 'YourBundle:Address',
                             'query_builder' => function(EntityRepository $er) use ($accountId) {
                                                   return $er->createQueryBuilder('a')
                                                             ->where('a.accountId = ?1')
                                                             ->setParameter(1, $accountId)));
     }
}

最新更新