Laravel 查看带有参数的路线显示两次的内容

Laravel view content showing twice for routes with parameters

我正在使用 Laravel 5.5,我有两个带有这样参数的获取路由

Route::get( 'route/{parameter}', 'Controller@action' )->name( 'controller.action' );

我的控制器操作只是加载视图:

public function action( $slug ) {
    return view( 'view', [
        'post' => Post::whereSlug( $slug )->first()
    ] );
}

我的基地app.blade.php查看内容是:

<!-- ==========================
  PAGE WRAPPER
=========================== -->
<div class="page-wrapper">

    <!-- ==========================
          HEADER
        =========================== -->
    <header class="header" id="header">

        <!-- Hamburger -->
        <div class="h-hamburger" id="hamburger">
            <svg class="h-hamburger__icon">
                <use xlink:href="#icon-hamburger"></use>
            </svg>
        </div>

        <!-- Logo -->
        <div class="h-logo">
            <a href="{{route('dashboard')}}" title="{{config('app.name','Sensei U')}}">
                <img class="h-logo__img" src="{{URL::to('/')}}/images/logo-black.svg"
                     alt="{{ config('app.name', 'Sensei U') }}">
            </a>
        </div>

    @if (Auth::user())

        <!-- Welcome -->
            <div class="h-welcome">

                <!-- Title -->
                <div class="h-welcome__title">Welcome Back, {{Auth::user()->name}}</div>

                <!-- Date -->
                <div class="h-welcome__date">{{date('F j')}}</div>

                <!-- Time -->
                <div class="h-welcome__time">{{date('g:i a')}}</div>

            </div>
            <!-- Profile -->
            <div class="h-profile">

                <!-- Avatar -->
                <img class="h-profile__avatar"
                     src="{{Auth::user()->image ? SenseiU::getImagePathBySize(Storage::url(Auth::user()->image), 58, 58) : ''}}"
                     srcset="{{Auth::user()->image ? SenseiU::getImagePathBySize(Storage::url(Auth::user()->image), 116, 116) : ''}} 2x"
                     alt="{{Auth::user()->name}}">
            @if(($notifications = SenseiU::generateNotificationMessages( Auth::user() )) )
                <!-- Notifications -->
                    <button class="h-profile__notifications" data-uid="{{Auth::user()->id}}"
                            data-url="{{route('member.nr', [Auth::user()])}}">
                        {{count($notifications)}}
                    </button>
                @endif

            </div>

        @if($notifications)

            <!-- Notifications Dropdown -->
                <ul class="noti-dropdown">
                    @foreach($notifications as $notification)
                        <li class="noti-dropdown__item">
                            <a class="noti-dropdown__link" href="{{$notification['link']}}">
                                {{$notification['msg']}}
                            </a>
                        </li>
                    @endforeach
                </ul>
            @endif
        @endif

    </header>
    <!-- ==========================
      CONTENT WRAPPER
    =========================== -->
    <div class="wrapper">
        <!-- ==========================
          SIDEBAR
        =========================== -->
        <aside class="sidebar" id="sidebar">
            <!-- Menu -->
            <nav class="sidebar-menu">
                @if(Auth::user())
                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'dashboard' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('dashboard')}}">
                        <span class="sidebar-menu__title">Home</span>
                    </a>

                    @permission('daily-mastery')
                    <a class="sidebar-menu__item  {{Route::currentRouteName() == 'member.daily-mastery' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.daily-mastery')}}">
                        <span class="sidebar-menu__title">Daily Mastery</span>

                        @if(SenseiU::getPageNotificationsCount( Auth::user(), [
                        'App\Notifications\TipPublishedNotification',
                        'App\Notifications\ExerciseSchedulePublishedNotification'] ))

                            <span class="sidebar-menu__notifications">{{SenseiU::getPageNotificationsCount( Auth::user(), [
                        'App\Notifications\TipPublishedNotification',
                        'App\Notifications\ExerciseSchedulePublishedNotification'] )}}</span>
                        @endif
                    </a>
                    @endpermission

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.macros' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.macros')}}">
                        <span class="sidebar-menu__title">Macros Calculator</span>
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.instructional-videos' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.instructional-videos')}}">
                        <span class="sidebar-menu__title">Instructional Videos</span>
                        @if(SenseiU::getPageNotificationsCount( Auth::user(), [
                        'App\Notifications\VideoPublishedNotification'] ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getPageNotificationsCount( Auth::user(), [
                        'App\Notifications\VideoPublishedNotification'] )}}</span>
                        @endif
                    </a>

                    @permission('health-articles')
                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.nutrition' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.nutrition')}}">
                        <span class="sidebar-menu__title">Nutrition</span>
                        @if(SenseiU::getArticleSectionNotificationsCount( Auth::user(), 2 ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getArticleSectionNotificationsCount( Auth::user(), 2 )}}</span>
                        @endif
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.sports-injuries' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.sports-injuries')}}">
                        <span class="sidebar-menu__title">Sports Injuries</span>
                        @if(SenseiU::getArticleSectionNotificationsCount( Auth::user(), 3 ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getArticleSectionNotificationsCount( Auth::user(), 3 )}}</span>
                        @endif
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.mobility-stretching' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.mobility-stretching')}}">
                        <span class="sidebar-menu__title">Mobility & Stretching</span>
                        @if(SenseiU::getArticleSectionNotificationsCount( Auth::user(), 4 ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getArticleSectionNotificationsCount( Auth::user(), 4 )}}</span>
                        @endif
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.functional-training' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.functional-training')}}">
                        <span class="sidebar-menu__title">Functional Training</span>
                        @if(SenseiU::getArticleSectionNotificationsCount( Auth::user(), 5 ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getArticleSectionNotificationsCount( Auth::user(), 5 )}}</span>
                        @endif
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.articles' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.articles')}}">
                        <span class="sidebar-menu__title">Articles</span>
                        @if(SenseiU::getArticleSectionNotificationsCount( Auth::user(), 1 ))
                            <span class="sidebar-menu__notifications">{{SenseiU::getArticleSectionNotificationsCount( Auth::user(), 1 )}}</span>
                        @endif
                    </a>
                    @endpermission

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.faqs' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.faqs')}}">
                        <span class="sidebar-menu__title">FAQs</span>
                    </a>

                    <a class="sidebar-menu__item" href="#">
                        <span class="sidebar-menu__title">Ultimate Personal Trainer</span>
                    </a>
                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'member.profile.edit' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('member.profile.edit')}}">
                        <span class="sidebar-menu__title">Edit Profile</span>
                    </a>
                    <a class="sidebar-menu__item" href="{{URL::to('logout')}}">
                        <span class="sidebar-menu__title">Logout</span>
                    </a>
                @else
                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'login' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('login')}}">
                        <span class="sidebar-menu__title">Login</span>
                    </a>

                    <a class="sidebar-menu__item {{Route::currentRouteName() == 'register' ? 'sidebar-menu__item--active' : ''}}"
                       href="{{route('register')}}">
                        <span class="sidebar-menu__title">Register</span>
                    </a>
                @endif
            </nav>

        </aside>


        <!-- ==========================
              CONTENT
            =========================== -->
        <main class="content @yield('main-class')">
            <!-- Container -->
            <div class="@yield('container-class')">
                @if(session('msg'))
                    <div class="msg msg-{{session('status')}}">
                        {{session('msg')}}
                    </div>
                @endif
                @yield('content')
            </div>
        </main>
    </div>
</div>

我的浏览内容是这样的:

@extends('layouts.app')

@section('title', $title)
@section('container-class', 'container')

@section('content')
    @if($post)
        <div class="cover" style="background-image:url('{{Storage::url($post->file)}}');"></div>
        <article class="article__container">
            <h1>{{$post->title}}</h1>
            <div>{!!$post->text!!}</div>
        </article>
    @endif
@stop

问题是我的视图内容显示重复,一个 404 在实际视图内容之上,如下所示:

这可能是因为您的帖子有问题。如果您在 slug 中包含特殊字符 Laravel 将无法自动解决此问题,因为它假定它是另一个 URL。我假设您正在尝试查看一个 post,它有一个像 my/first/post 这样的 slug,如果您在路由中包含一个 where 语句,这将起作用。你必须做这样的事情:

Route::get('route/{parameter}', 'Controller@action')
    ->name('controller.action')
    ->where('parameter', '([A-Za-z0-9\-\/]+)');

这样路由将包含一个正则表达式,它验证完整的字符串是否有效。

我不知道为什么它会同时显示 post 和 404 页面,看起来你只是在 layouts.app

中包含了默认的 404 页面

我弄明白了,我会留下一个答案以供将来参考,问题不在于 Laravel,而是一个 javascript 问题,我头上有这段代码:

    <script>
    var ajax = new XMLHttpRequest();

    ajax.open('GET', '/images/sprites.svg', true);

    ajax.send();

    ajax.onload = function (e) {

        var div = document.createElement('div');

        div.innerHTML = ajax.responseText;

        document.body.insertBefore(div, document.body.childNodes[0]);

    };
</script>

加载 svg sprite 并将其插入要使用的页面,ajax url 在带有参数的路由上返回 404,因此 404 页面显示在视图上方,我通过使用这样的绝对 url 来修复它:

ajax.open('GET', '{{URL::to('/')}}/images/sprites.svg', true);

谢谢大家的帮助。