URL有效,但视图不加载

发布于 2025-01-21 10:33:03 字数 6151 浏览 3 评论 0原文

我一直在一个在线学习网站上为学校项目工作。在课程中,单击属于部分的课程时,我遇到了麻烦。这个想法是在课程页面上(构造。然后,它应该显示一个带有相同菜单的页面,并显示课程的内容代替课程摘要(thress.html.twig)。

我已经更新了控制器,因此URL到达: 构造/领事构造ind-sectionId-lessonid

在视图中,我写下{{path('app_formations_lesson',{'formation':formation.id':formation.id,'section'section.id':exection.id,'id'':fersh.id}}}}} }

在我单击时,它可以为URL工作,并且在我单击时显示正确的值,但是页面刷新并且不会加载正确的twig视图(thress.html.twig),它加载了我当前使用的相同视图(编队。 html.twig)。

Formations Controller:

#[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 %}

thress.html.twig

{% 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 %}

sidebar块

<!-- 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>

该问题来自哪里?如何显示正确的视图? 多谢!

编辑:我在控制器中交换了代码,以首先匹配seelexton函数。

#[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
        ]);
    }

I've been working on an online learning website for a school project. I've had trouble passing variales when clicking on a lesson, belonging to a section, inside a course. The idea is that on a course page (formation.html.twig), there's a summary of the course, and you can click on the lessons which are in a sidebar menu. It should then display a page with the same menu, and the content of the lesson showing in place of the course summary (lesson.html.twig).

I've updated the controller so the url goes:
formations/consulter-formationid-sectionid-lessonid

In the view, I wrote {{ path('app_formations_lesson', {'formation':formation.id, 'section': section.id, 'id':lesson.id}) }}

It's working alright for the url and the right values show when I click, but the page refreshes and won't load the right twig view (lesson.html.twig), it loads the same view I'm currently on (formation.html.twig).

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 %}

lesson.html.twig

{% 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 %}

sidebar block

<!-- 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>

Where does this issue come from? How can I display the right view?
Thanks a lot!

edit: I swapped the code in the controller to match the seeLesson function first.

#[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
        ]);
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

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

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

如果您要请求例如/formations/Consulter-1-2-3
Symfony首先尝试将其与/formerations/Consulter- {id}匹配。
如果您将1-2-3替换为{ID},则可以匹配,因此它执行请参见方法。

要修复您有两个选项:

要么切换控制器中2个方法的顺序,以便方法seexsexon> 中定义了方法。然后,Symfony将首先尝试与seelexton方法的路由匹配。

或按原样保留方法顺序,但在{id}参数中添加一个约束,请参见参见方法,以指定匹配的{ID }只能由数字组成:

#[Route('/formations/Consulter- {id}',name:'app_formations_see',要求:['ID'=&gt;'\ d+']) ]

It's rendering the wrong page because your URLs are too similar.

When trying to determine what method to execute, Symfony matches the requested URL against the route definitions above the controller methods from top to bottom.

If you're requesting for example /formations/consulter-1-2-3,
Symfony first tries to match this against /formations/consulter-{id}.
This matches if you substitute 1-2-3 for {id}, so it executes the see method.

To fix you have two options:

Either switch the order of the 2 methods in your controller so that the method seeLesson is defined above the see method. Symfony will then first try to match against the route for the seeLesson method.

Or keep the method order as is, but add a constraint to the {id} parameter in the route for the see method, to specify that the matched {id} can only consist of digits:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文