我正在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