2017-05-04 65 views
0

我使用Symfony 3.2和doctrine和postgresql。無效的文本表示形式:7錯誤:uuid輸入語法無效:「test」

我創建了一個以uuid作爲主鍵的實體。

我的實體定義:

/** 
* Booking 
* 
* @ORM\Table(name="booking") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\BookingRepository") 
* @ORM\EntityListeners({"AppBundle\EventListener\BookingListener"}) 
*/ 
class Booking { 
    /** 
    * @var string 
    * 
    * @ORM\Column(type="guid") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 
} 

在我的控制器我有這樣的表演動作:

/** 
* @Route("booking/{id}", name="booking_show") 
* @Method({"GET"}) 
*/ 
public function showAction(Request $request, Booking $booking) { 
    ... 
} 

一切似乎都做工精細,但當我嘗試加載路徑把一個錯誤值作爲ID(即/booking/hello123),收到一個:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for uuid: "hello123" 

相反,我期望一個404.

有沒有辦法捕捉這個異常並重定向到404頁面?

+1

你可以嘗試用更具體的路由,即'@Route(「/預訂/ { {}},name =「booking_show」,requirements = {「id」:「[0-9A-Fa-f] {4}( - ?[0-9A-Fa-f] {4}){7}」 })' – pozs

回答

0

您需要更改的showAction

/** 
* @Route("booking/{id}", name="booking_show") 
* @Method({"GET"}) 
*/ 
public function showAction(Request $request,$bookingID) { 
    $em = $this->getDoctrine()->getManager(); 
    $booking = $em->getRepository('AppBundle:Entity')->find(bookingID); 
    if(!$booking) 
    $this->createNotFoundException('No entity found with id :'.$bookingID); 
    ... 
} 
+0

這實際上是行不通的:當'bookingId'不是一個有效的'UUID'時,'find'方法拋出異常' –

+0

嘗試添加的uuid 功能isValidUuid($ UUID){ 如果(的驗證!IS_STRING($ UUID)|| (的preg_match('/^[0-9A-F] {8} - [0-9A-F] {4} -4- [0-9A-F] {3} - [89ab] [0-9A-F] {3} - [0-9a-f] {12} $ /',$ uuid)!== 1)){ return false; } return true; } –

2

可以使Route Requirements使用 - 你可以指定哪些條件的參數需要搭配「有資格」到一定的路線。這要求是一個正則表達式,因此,所有你需要做的是寫一個正則表達式的UUID

/** 
* @Route("booking/{id}", name="booking_show", requirements={"id": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"}) 
* @Method({"GET"}) 
*/ 
public function showAction(Request $request, Booking $booking) { 
    ... 
} 

注:上述正則表達式使用的只是第一個結果我在谷歌找到了UUID正則表達式,我沒有驗證是否它的工作原理

在結束時,如果你的ID不匹配正則表達式,它不匹配的路線,你應該得到404

+0

謝謝,這應該是被接受的答案:) – Nextar