2017-05-04 45 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