我使用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页面?
答案 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);
...
}