class Thing {
/*** loads of properties ***/
/**
* This is a many to many relation from Thing to Tags
* @var \Doctrine\Common\Collections\Collection
*
* @Assert\All({
* @Assert\Uuid()
* })
*/
private $tags;
/*** moar stuff ***/
}
/*** On the controller ***/
protected function validateAndPersist(Request $request, AbstractEntity $entity, $successHttpCode)
{
$form = $this->createForm($this->getFormDefinition(), $entity);
$form->submit($request);
if ($form->isValid() === true) {
$this->getDoctrineManager()->persist($entity);
$this->getDoctrineManager()->flush();
return $this->createView($entity, $successHttpCode);
}
return $form;
}
所以我有高於此實體,其具有匹配的Symfony形式,並由控制器這一切都紮起來很好。進來的有效載荷是爲了向標籤屬性發送一個UUID數組。這工作得很好,關係正確保存。的Symfony /學說:驗證關係的ID BEFORE symfony的解析到一個實體上的表單提交
所以有一些驗證,以確保我們收到一個UUID數組。
然而問題是,當我沒有收到一個UUID數組時。 $form->submit()
正試圖通過原則將傳入的ID解析爲實際的標籤。 postgres數據庫抱怨說它不是一個有效的UUID(相關字段的類型爲guid),並且我得到一個Doctrine錯誤。它感覺好像這是在表單驗證之前發生的,或者由於存在多對多關係,驗證在這個字段上根本不會執行。
無論哪種方式,這將導致在Doctrine\DBAL\DBALException
在該消息中包含的SQL查詢和諸如此類的東西和一個大多汁的500錯誤的詳細信息:
{
"code": 500,
"message": "An exception occurred while executing 'SELECT t0_.tag_id AS tag_id_0, t0_.name AS name_1 FROM tag t0_ WHERE t0_.tag_id IN (?)' with params [\"comedy\"]:\n\nSQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for uuid: \"comedy\""
}
我顯然想要的是在實體定義的驗證實際上會發生,因爲這會觸發正確的HTTP響應,而沒有任何樣板代碼來處理這種特定情況。
任何想法?
如果上述答案不起作用,請使用表單類型中處理標籤的部分更新您的問題。 – Cerad
謝謝康斯坦丁,就是這樣。 – NabLa