2013-12-22 54 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