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

Pro*_*oGM 0 postgresql symfony doctrine-orm

我将 Symfony 3.2 与学说和 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;
}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我有一个这样的显示动作:

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

一切似乎都正常,但是当我尝试加载将错误值作为 ID(即/booking/hello123)的路由时,我收到:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR: invalid input syntax for uuid: "hello123"
Run Code Online (Sandbox Code Playgroud)

相反,我希望得到 404。

有没有办法捕获此异常并重定向到 404 页面?

Tom*_*ski 5

您可以利用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) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

最后,如果您的 id 与正则表达式不匹配,则它与路由不匹配,您应该得到 404。