文本表示无效:7错误:uuid的输入语法无效:" test"

时间:2017-05-04 08:39:55

标签: postgresql symfony doctrine-orm

我使用Symfony 3.2和doctrine以及postgresql。

我创建了一个以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页面?

2 个答案:

答案 0 :(得分:4)

您可以使用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) {
  ...
}

注意:上面使用的正则表达式只是我在Google中为UUID正则表达式找到的第一个结果,我没有验证它是否有效

最后,如果您的ID与正则表达式不匹配,则它与路线不匹配,您应该得到404.

答案 1 :(得分: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);
  ...
}