Symfony 4 использует URL для проверки базы данных, если страница существует еще 404 - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь создать форум, который использует как можно меньше шаблонов, чтобы быть действительно динамичным, используя базу данных для заполнения форума.

Я хотел бы, чтобы мой контроллер проверил базу данных и удостоверился, что 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 %}

Как видно из шаблона ветки, ссылки полагаются на поле $ name сущности для создания URL-адреса каждой страницы и являются полностью динамическими.

Заранее спасибо, если вам нужна дополнительная информация в комментариях, и я могу обновить этот пост.

1 Ответ

0 голосов
/ 01 мая 2018

Чтобы узнать, найден ли предмет на текущий момент 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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...