Symfony子表单更改setter函数

时间:2015-06-26 14:48:22

标签: php symfony symfony-forms symfony-2.6

在数据库模型上,我在contact和contactAddress之间有一对多的关系。

我在ContactType中创建了2个不同的表单,我添加了子表单

$builder->add(
    'contactAddress',
    new ContactAddressType()
);

联系人实体类本身就有这个,但是这个实体在另一个包中,我无法改变它。

private $contactAddresses;

public function addContactAddress(ContactAddress $contactAddresses)
{
    $this->contactAddresses[] = $contactAddresses;

    return $this;
}

public function removeContactAddress($contactAddresses)
{
    $this->contactAddresses->removeElement($contactAddresses);
}

public function getContactAddresses()
{
    return $this->contactAddresses;
}

表单已正确呈现,但是当我提交表单时,我收到以下错误

Neither the property "contactAddress" nor one of the methods
"getContactAddress()", "contactAddress()", "isContactAddress()", 
"hasContactAddress()", "__get()" exist and have public access in class
"App\Bundle\ContactBundle\Entity\Contact".

当我将字段更改为contactAddresses时,会出现以下错误:

Neither the property "contactAddresses" nor one of the methods 
"addContactAddress()"/"removeContactAddress()", 
"setContactAddresses()", "contactAddresses()", "__set()" or "__call()" 
exist and have public access in class 
"App\Bundle\ContactBundle\Entity\Contact".

我如何使用property_path之类的内容来说明如何设置属性,因为它似乎使用了setContactAddresses并不存在?

2 个答案:

答案 0 :(得分:0)

我不知道这是否会导致问题中描述的错误,但您无法将集合属性映射到单个表单类型。在这种情况下,联系人有很多$contactAddresses,因此$contactAddresses是一个集合。这意味着要在ContactType中表示$contactAddresses,您需要添加collection field。例如:

$builder->add('contactAddresses', 'collection', array(
    'type'   => new ContactAddressType(),
    'options'  => array(
        ...
    ),
));

使用这样的表单,您可以更新现有地址,但添加和删除您需要添加一些客户端javascript的地址。通过收集字段,symfony可以提供一些帮助。在Collection field type - Adding and removing items的Symfony文档中有关于此的一些信息。但是,对于实体集合,您可能需要查看Cookbook条目How to embed a collection of forms

答案 1 :(得分:0)

我认为你应该在主表单中嵌入一个表单集合。

Read the docs