url有效,但视图未加载



我一直在为一个学校项目开发在线学习网站。我在点击课程中属于某个部分的课程时,遇到了传递变体的问题。这个想法是,在课程页面(formation.html.titch(上,有一个课程摘要,你可以点击侧边栏菜单中的课程。然后,它应该显示一个具有相同菜单的页面,并显示课程内容来代替课程摘要(课程.html.trick(

我已经更新了控制器,因此url为:编队/顾问编队

在视图中,我写了{路径('app_formations_lesson',{'formation':formation.id,'section':section.id,'id':课程.id(}}}

它对url工作正常,当我点击时会显示正确的值,但页面会刷新,不会加载正确的trick视图(课程.html.trick(,它加载的是我当前使用的相同视图(formation.html.titch(。

FormationsController:

#[Route('/formations/consulter-{id}', name: 'app_formations_see')]
public function see($id): Response
{
$formation = $this->doctrine->getRepository(Formation::class)->findOneById($id);
$section  = $this->doctrine->getRepository(Section::class)->findAll();
$lesson = $this->doctrine->getRepository(Lesson::class)->findAll();
return $this->render('formations/formation.html.twig', [
'formation' => $formation,
'sections' => $section,
'lessons' => $lesson
]);
}
#[Route('/formations/consulter-{formation}-{section}-{id}', name: 'app_formations_lesson')]
public function seeLesson($id): Response
{
$lesson = $this->doctrine->getRepository(Lesson::class)->findOneById($id);
return $this->render('formations/lesson.html.twig', [
'lesson' => $lesson
]);
}

formation.html.twig

{% extends 'base.html.twig' %}
{% block title %}{{ formation.title }}{% endblock %}
{% block content %}
<div class="formationcontainer text-center">
{% block sidebar %}
{% include "./formations/sidebar.html.twig" %}
{% endblock %}
<h1>{{ formation.title }} par {{ formation.user.firstname }} {{ formation.user.lastname }}</h1>
{{ formation.description }}
<hr>
<h2>Sommaire</h2>
<div class="tableau">
<table class="table">
{% for section in formation.sections %}
<thead class="table-success">
<tr>
<th scope="col">{{ section.name }}</th>
</tr>
</thead>
<tbody>
{% for lesson in section.lessons %}
<tr>
<td>{{ lesson.title }}</td>
</tr>
{% endfor %}
</tbody>
{% endfor %}
</table>
</div>
</div>
{% endblock %}

无线

{% extends 'base.html.twig' %}
{% block title %}titre de la leçon{% endblock %}
{% block content %}
<div class="formationcontainer text-center">
{% block sidebar %}
{% include "./formations/sidebar.html.twig" %}
{% endblock %}
<h1>Nom de la leçon</h1>
<hr>
<h2>Vidéo</h2>
<h2>Contenu</h2>
</div>
{% endblock %}

侧边栏块

<!-- Sidear for lesson pages -->
<nav class="flex-shrink-0flex-shrink-0 p-3 bg-white sidenav">
<button class="btn btn-success" id="sidenav-btn" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarCollapse" aria-expanded="false" aria-controls="collapseOne">
Sommaire
</button>
<div class="list-unstyled ps-0 ul-custom navbar-collapse collapse show" id="sidebarCollapse" aria-expanded="true">
<li class="mb-1">
{% for section in formation.sections %}
<ul class="list-unstyled align-items-center rounded fw-normal">
<li>{{ section.name }}</li>
</ul>
<div>
{% for lesson in lessons %}
<ul class="list-unstyled fw-normal pb-1 small">
<li><a href="{{ path('app_formations_lesson',  {'formation':formation.id, 'section': section.id, 'id':lesson.id}) }}" class="link-dark rounded">{{ lesson.title }}</a></li>
</ul>
{% endfor %}
</div>
{% endfor %}
</li>
<li class="border-top my-3"></li>
<li class="mb-1">
<ul class="list-unstyled fw-normal pb-1 small">
<li><a href="{{path('app_formations')}}" class="link-dark rounded">retour à la liste des formations</a></li>
</ul>
</li>
</div>
</nav>

这个问题从何而来?如何显示正确的视图?非常感谢!

edit:我交换了控制器中的代码,以首先匹配seeLesson函数。

#[Route('/formations/consulter-{formation}-{section}-{id}', name: 'app_formations_lesson')]
public function seeLesson($id): Response
{
$formation = $this->doctrine->getRepository(Formation::class)->findOneById($id);
$section  = $this->doctrine->getRepository(Section::class)->findAll();
$lesson = $this->doctrine->getRepository(Lesson::class)->findOneById($id);
return $this->render('formations/lesson.html.twig', [
'lesson' => $lesson,
'formation' => $formation,
'sections' => $section
]);
}
#[Route('/formations/consulter-{id}', name: 'app_formations_see')]
public function see($id): Response
{
$formation = $this->doctrine->getRepository(Formation::class)->findOneById($id);
$section  = $this->doctrine->getRepository(Section::class)->findAll();
$lesson = $this->doctrine->getRepository(Lesson::class)->findAll();
return $this->render('formations/formation.html.twig', [
'formation' => $formation,
'sections' => $section,
'lessons' => $lesson
]);
}

由于您的URL太相似,它呈现了错误的页面。

当试图确定要执行的方法时,Symfony将请求的URL与控制器方法上方的路由定义从上到下进行匹配。

如果您请求例如CCD_ 1,Symfony首先尝试将其与/formations/consulter-{id}相匹配。如果将{id}替换为1-2-3,则这是匹配的,因此它执行see方法。

要修复,您有两个选项:

切换控制器中两种方法的顺序,使方法seeLesson定义在see方法之上。Symfony将首先尝试与seeLesson方法的路由相匹配。

或者保持方法顺序不变,但为/formations/consulter-1-2-30方法的路由中的{id}参数添加约束,以指定匹配的{id}只能由数字组成:

#[Route('/formations/consulter-{id}', name: 'app_formations_see', requirements: ['id' => 'd+'])]

最新更新