Laravel如何仅在特定视图(post.blade.php)显示导航项
实现仅在特定视图显示导航项的解决方案
看起来你想在Laravel的app.blade.php布局中,只在打开post.blade.php视图时显示"Post New"这个导航项。你之前尝试的@Post和@endPost是自定义指令,但Laravel默认没有这个语法,所以我们可以用几种更简单的方法来实现:
方法1:通过视图名称判断
Laravel的View facade可以获取当前加载的视图名称,我们可以用这个来判断是否是post.blade.php:
@guest <li class="nav-item"> <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a> </li> @if (Route::has('register')) <li class="nav-item"> <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a> </li> @endif {{-- 仅在post视图显示导航项 --}} @if(View::getName() === 'post') <div><a href="/p/create">Post New</a></div> @endif @endguest
注意:如果你的post.blade.php放在子目录里(比如resources/views/blog/post.blade.php),视图名称会是blog.post,这时候要把判断条件改成View::getName() === 'blog.post'。
方法2:通过路由名称判断
如果post.blade.php对应的路由有定义名称(比如在web.php里给路由命名),可以通过路由名称来判断:
假设你的路由定义是这样的:
Route::get('/post/{id}', [PostController::class, 'show'])->name('post.show');
那么在布局里可以这样写:
@guest <li class="nav-item"> <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a> </li> @if (Route::has('register')) <li class="nav-item"> <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a> </li> @endif {{-- 匹配post对应的路由名称 --}} @if(Route::currentRouteName() === 'post.show') <div><a href="/p/create">Post New</a></div> @endif @endguest
这种方法更灵活,哪怕视图文件名变化,只要路由名称不变,判断逻辑依然有效。
方法3:通过控制器传递变量
在返回post.blade.php的控制器方法里,传递一个标记变量,然后在布局中判断这个变量是否存在:
控制器代码:
public function show($id) { $post = Post::findOrFail($id); // 传递标记变量 return view('post', compact('post'))->with('showPostNav', true); }
布局代码:
@guest <li class="nav-item"> <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a> </li> @if (Route::has('register')) <li class="nav-item"> <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a> </li> @endif {{-- 判断是否存在该变量 --}} @isset($showPostNav) <div><a href="/p/create">Post New</a></div> @endisset @endguest
这种方法最直观,适合需要精确控制显示场景的情况。
内容的提问来源于stack exchange,提问作者yokana
相关产品推荐
相关产品推荐

