2013-12-22 26 views
1

我正在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. 
} 
+0

可能有帮助如果您发布错误消息。你有没有尝试'实体 - > setAddress()'之前坚持你的控制器updateAction? – mattexx

+0

错误消息是Address-Entity的验证失败,因为Address-Entity中的两个字段为空。但我根本不需要任何地址实体 - 除非我明确创建一个地址实体。我不希望Symfony为我创建一个空的Address-Entity。我还没有坚持 - 错误在之前。我用一些控制器代码更新了上面的问题 - 希望能够澄清问题。 – Stefan

回答

0

在物业地址标注::删除级联

/** 
* @var Address 
* @ORM\OneToOne(targetEntity="Koala\AddressBundle\Entity\Address") 
* @Assert\Valid 
*/ 
+0

不幸的是,这并不能解决问题 - 在尝试保存更改时仍会创建Address实体。 – Stefan