【问题标题】:Symfony4 "object not found by the @ParamConverter annotation" 404 errorSymfony4“@ParamConverter 注释找不到对象”404 错误
【发布时间】:2019-01-02 10:23:24
【问题描述】:

我发现 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 时,它返回一个 404 错误:
App\Entity\Description @ParamConverter 注释找不到对象 em>

【问题讨论】:

  • 简单安装即可:``` composer require annotations ```

标签: symfony4


【解决方案1】:

经过几个小时寻找解决方案,我终于阅读了https://symfony.com/doc/current/routing.html 并明白了 /blog/{id} 注释 catch /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 提到的解决方案是唯一具有多个实体和控制器的解决方案!

【讨论】:

  • 它可以帮助使用 php bin/console debug:router 或 php bin/console router:match (用你的路径替换 ,在我的示例中为“/about”
【解决方案2】:

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

例如。

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

要求是一个正则表达式。

【讨论】:

    【解决方案3】:

    在您的情况下,您有相同的方法,即 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,
        ]);
    }
    

    【讨论】: