簡體   English   中英

url 有效但未加載視圖

[英]url valid but view not loading

我一直在為一個學校項目開發一個在線學習網站。 單擊課程中屬於某個部分的課程時,我無法通過變量。 這個想法是在課程頁面 (formation.html.twig) 上有課程摘要,您可以單擊側邊欄菜單中的課程。 然后它應該顯示一個具有相同菜單的頁面,並顯示課程內容代替課程摘要(lesson.html.twig)。

我已經更新了 controller,所以 url 變成了:formations/consulter-formationid-sectionid-lessonid

在視圖中,我寫了 {{ path('app_formations_lesson', {'formation':formation.id, 'section': section.id, 'id':lesson.id}) }}

它對 url 工作正常,當我單擊時顯示正確的值,但頁面刷新並且不會加載正確的 twig 視圖(lesson.html.twig),它加載我當前所在的相同視圖(formation.html 。枝條)。

編隊控制器:

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

形成.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 %}

課程.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 %}

側邊欄塊

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

這個問題從何而來? 如何顯示正確的視圖? 非常感謝!

編輯:我先交換了 controller 中的代碼以匹配 seeLesson function。

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

它呈現錯誤的頁面,因為您的網址太相似了。

當試圖確定執行什么方法時,Symfony 將請求的 URL 與 controller 方法上方的路由定義從上到下進行匹配。

例如,如果您請求/formations/consulter-1-2-3 , Symfony 首先嘗試將其與/formations/consulter-{id}進行匹配。 如果您將1-2-3替換為{id} ,這將匹配,因此它會執行see方法。

要修復你有兩個選擇:

在 controller 中切換 2 種方法的順序,以便在see方法上方定義方法seeLesson Symfony 將首先嘗試匹配seeLesson方法的路由。

或者保持方法順序不變,但在see方法的路由中的{id}參數中添加約束,指定匹配的{id}只能由數字組成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM