无效的文本表示形式:7错误:uuid输入语法无效:“test”
我使用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页面?
您需要更改的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);
...
}
这实际上是行不通的:当'bookingId'不是一个有效的'UUID'时,'find'方法抛出异常' –
尝试添加的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; } –
可以使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
谢谢,这应该是被接受的答案:) – Nextar
你可以尝试用更具体的路由,即'@Route(“/预订/ { {}},name =“booking_show”,requirements = {“id”:“[0-9A-Fa-f] {4}( - ?[0-9A-Fa-f] {4}){7}” })' – pozs