Symfony4 "object not found by the @ParamConverter annotation" 404 错误

Symfony4 "object not found by the @ParamConverter annotation" 404 error

我发现 Symfony4 与 https://symfony.com/doc/current/routing.html 中描述的类似博客示例 然后我添加了一条新路由来添加 /blog/about 页面。所以我的 src/Controller/BlogController.php 中的一部分代码是:

/**
 * @Route("/blog/{id}", name="blog_show")
 */
public function show(Description $article) {
    return $this->render('blog/show.html.twig', [
        'article' => $article,
    ]);
}

/**
 * @Route("blog/about", name="about")
 */
public function about() {
    return $this->render('blog/about.html.twig', [
        'copyright' => "GLPI 3",
    ]);
}

当我 运行 locahost:8000/blog/about 时,它 returns 给我一个 404 错误 :
App\Entity\Description @ParamConverter 注释未找到对象

经过数小时的寻找解决方案,我终于阅读了 https://symfony.com/doc/current/routing.html 并了解到 /blog/{id} 注释赶上 /blog/about 路由但是不能用!

通过在我的控制器文件中切换函数顺序:

/**
 * @Route("/blog/about", name="blog_about")
 */
public function about() {
    return $this->render('blog/about.html.twig', [
        'copyright' => "GLPI 3",
    ]);
}

/**
 * @Route("/blog/{id}", name="blog_show")
 */
public function show(Description $article) {
    return $this->render('blog/show.html.twig', [
        'article' => $article,
    ]);
}

工作正常!

@tom 提到的解决方案是唯一具有多个实体和控制器的解决方案!

如果您向路线添加要求,则顺序无关紧要。

例如

/**
 * @Route("/blog/{id}", name="blog_show", requirements={"id":"\d+"})
 */

要求是正则表达式。

在你的情况下,你有相同的方法,即 GET

因此,第一个到达的路径是 /blog/about 并且“about”被解释为 ID 不是这样的 !

所以解决这个问题最简单的方法就是切换函数顺序:

/**
 * @Route("/blog/about", name="blog_about")
 */
public function about() {
    return $this->render('blog/about.html.twig', [
        'copyright' => "GLPI 3",
    ]);
}

/**
 * @Route("/blog/{id}", name="blog_show")
 */
public function show(Description $article) {
    return $this->render('blog/show.html.twig', [
        'article' => $article,
    ]);
}