Symfony 4使用URL检查数据库是否存在页面,否则404



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

我想做的是让我的控制器检查数据库并确保 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},因此您可以从字面上键入任何内容,并且不会有错误,只是一个带有空白部分的模板。(我确实尝试了{主题}而不是{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 %}

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

提前感谢您,如果您需要更多信息,请在评论中弹出,我可以更新这篇文章。

为了知道在当前URL是否找到一个项目,你可以测试$topic是否NULL

use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
/**
* @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]);
}

相关内容

最新更新