我正在Symfony 2.4项目中运行Doctrine 2.4,并且在创建/验证表单时遇到了一些问题。在Symfony的OneToOne关系上创建空实体
我有一个实体“人”与OneToOne关系到“地址”实体(单向) - 所以人可以有一个或没有地址。
/**
* @var Address
* @ORM\OneToOne(targetEntity="Koala\AddressBundle\Entity\Address", cascade={"all"})
* @Assert\Valid
*/
private $address;
public function setAddress(Address $address = null)
{
$this->address = $address;
}
在我的形式呈现PersonType I类添加的代码如下:
$builder->add('address', AddressType::SERVICE_NAME,
array(
'label' => 'address._label',
'required' => false
)
);
加载/显示不具有地址的人实体正常工作 - 即没有字段显示的地址,因为在我的枝条模板,我有:
{% if form.address.vars.value|default is not empty %}
{# address form here #}
{% endif %}
而且加载编辑表单工作正常,即没有地址的形式显示,因为我不希望在那个地方的地址该应用程序(但一般人可以有一个地址)。
现在的问题是,只要我在个人窗体中更改某些内容并将更改提交到服务器,表单验证就会失败,因为Symfony会创建一个新的空Address对象,因为验证失败,因为有一些必填字段一个地址。但在这里我明确不想要一个地址。 我认为有if条件(见上文)应该解决这个问题。因为使用了两个看起来相同的不同树枝模板 - 只有一个没有地址对我来说显得很丑,并且违反了DRY-Principle。
我在做什么错?
如何阻止Symfony为某人创建空的地址对象?
编辑:
为了更好地说明,在控制器方法处理编辑,这里的代码:
public function editAction($id, $version, Request $request) {
try {
$company = $this->companyRepository->find($id, LockMode::PESSIMISTIC_WRITE, $version);
$routeId = array('id' => $id, 'version' => $company->getVersion());
$form = $this->createForm(CompanyType::SERVICE_NAME, $company, array(
'action' => $this->router->generate('replaced_for_stackoverflow', $routeId),
'method' => 'POST')
);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
// If isValid() were true, entity changes would get saved.
}
// But: isValid() is false, because there is an Address-Entity in one of the Person-entities attached to the company-entity. And this is because Symfony creates an Address-Instance by itself. And I don't know how to turn this behavior off.
}
}
// Rest of method left out as irrelevant to the problem.
}
可能有帮助如果您发布错误消息。你有没有尝试'实体 - > setAddress()'之前坚持你的控制器updateAction? – mattexx
错误消息是Address-Entity的验证失败,因为Address-Entity中的两个字段为空。但我根本不需要任何地址实体 - 除非我明确创建一个地址实体。我不希望Symfony为我创建一个空的Address-Entity。我还没有坚持 - 错误在之前。我用一些控制器代码更新了上面的问题 - 希望能够澄清问题。 – Stefan