簡體   English   中英

Symfony / Doctrine:在提交表單之前,symfony會將關系的ID解析為實體

[英]Symfony/Doctrine: Validating ID of relation BEFORE symfony resolves it to an entity on form submission

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數組發送到tags屬性。 這很好,關系已正確保存。

因此,已經進行了一些驗證,以確保我們接收到一組UUID。

但是,問題恰恰是當我沒有收到UUID數組時。 $form->submit()試圖通過學說將傳入的ID解析為實際的標簽。 postgres數據庫抱怨它不是有效的UUID(相關字段的類型為guid),並且出現了Doctrine錯誤。 感覺這似乎是在表單驗證之前發生的,或者由於多對多的關系,可能根本沒有在此字段上執行驗證。

無論哪種方式Doctrine\\DBAL\\DBALExceptionDoctrine\\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響應,而無需任何樣板代碼來處理這種特定情況。

有任何想法嗎?

您是否在主表單中使用另一個嵌入表單來標記? 在這種情況下,您需要對其設置cascade_validation屬性為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM