2015-11-20 26 views
0
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響應,而沒有任何樣板代碼來處理這種特定情況。

任何想法?

回答

0

您是否在主窗體中爲標籤使用了另一個嵌入窗體? 在這種情況下,您需要將cascade_validation屬性設置爲true就可以了。

+0

如果上述答案不起作用,請使用表單類型中處理標籤的部分更新您的問題。 – Cerad

+0

謝謝康斯坦丁,就是這樣。 – NabLa