【问题标题】:Symfony 4 use URL to check database if page exists else 404Symfony 4 使用 URL 检查数据库是否存在页面,否则 404
【发布时间】:2018-10-11 04:18:07
【问题描述】:

我正在尝试构建一个使用尽可能少的模板的论坛,以便真正动态地使用数据库来填充论坛。

我想做的是让我的控制器检查数据库并确保 URL 存在。

对象是只有存在的页面才会存在。因此,有人在地址 host.com/forum/foo/bar 中输入会收到错误消息“404 页面不存在”,而不是空白索引模板。

我正在使用 Symfony 4、Docrine、Twig、Annotations 和其他各种插件

当前代码

 //src/Controller/Controller.php

 /**
 * @Route("/forum/{category}/{slug}", name="page_topic")
 */
public function showTopic($slug){

    $repository = $this->getDoctrine()->getRepository(Topic::class);

    $topic = $repository->findOneBy(['name' => $slug]);



    return $this->render('forum/article.html.twig', ['topic' => $topic]);
}

这是主题页面的控制器,它当前循环主题中的所有线程。但是由于在页面加载之前没有检查 {category} 和 {slug},您可以按字面意思输入任何内容并且不会有错误,只是一个带有空白部分的模板。 (我确实尝试过 {topic} 而不是 {slug} 但由于我无法弄清楚如何处理检查,它会给出错误)

//templates/forum/article.html.twig

{% extends 'forum/index.html.twig' %}

{% block forumcore %}
    <div id="thread list">
        <h4>{{ topic.name }}</h4>
        <ul>
            {% for thread in topic.childThreads %}
                <li><a href="/forum/{{category.name}}/{{ topic.name }}/{{ thread.name }}"><h6>{{ thread.name }}</h6></a></li>
            {% endfor %}
        </ul>
    </div>
{% endblock %}

从 twig 模板中可以看出,链接依赖于实体的 $name 字段来生成每个页面的 URL,并且是完全动态的。

提前致谢,如果您需要更多信息,请在评论中弹出,我可以更新此帖子。

【问题讨论】:

  • 注意,所以我实际上并没有尝试太多来解决这个问题,我问了一个同意我需要处理 URL 的朋友,但在他与 Symfony3 合作的这些年里,他从来没有必要,所以不知道。 -- 我已经浏览了文档,但由于我不知道我在寻找什么,所以我找不到答案
  • 那么,检查$topic然后返回404?
  • 我需要检查此页面上的 $category 和 $topic。 ((即使如此,{{category.name}} 的 href 也会引发错误,因为我已经获取了 Topic repo 而不是 Category,{{category.name}} 不存在。我稍后会修复它,现在它只是 /forum/#/... 在实时数据中
  • @DarkBee。问题不是发现错误,而是检查 URL 变量以便我可以抛出错误。

标签: symfony4


【解决方案1】:

为了知道是否在当前URL 找到了一个项目,您只需测试$topic 是否为NULL

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

/**
* @Route("/forum/{category}/{slug}", name="page_topic")
*/
public function showTopic($slug){
    $repository = $this->getDoctrine()->getRepository(Topic::class);
    $topic = $repository->findOneBy(['name' => $slug]);
    if ($topic === null) throw new NotFoundHttpException('Topic was not found'); // This should activate the 404-page
    return $this->render('forum/article.html.twig', ['topic' => $topic]);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多