我有以下app.blade.php
模板:
<!-- Sidebar Area -->
@if (\Request::is('*/fields*'))
@include('streams.nav.editor-menu')
@else
@include('streams.nav.menu')
@endif
<!-- Content area -->
@yield('content')
您可以看到,到目前为止,我已经使用以下条件检查是否应显示特定的侧边栏:
@if (\Request::is('*/fields/*'))
上面仅检查路由是否包含fields
路由,如下所示:
Route::resource('streams/{stream}/fields', 'Stream\FieldsController');
现在,我已经到达需要在另一条路线资源上使用此侧边栏的地步:
Route::resource('streams/{stream}/documents', 'Stream\DocumentsController');
我可以将其添加到我的if
语句中:
@if (\Request::is('*/fields*') or \Request::is('*/documents*'))
...
@endif
但是,我想我需要为此语句添加更多的路由。
什么是最好的方法?是否可以在controller
中甚至在model
中声明?像这样:
//Fields.php
/**
* Specifies whether the editor menu should be shown or not.
*
* @return bool
*/
$sidebarEditor = true;
但是,我不确定如何实现此功能-还是有更好的方法?
答案 0 :(得分:2)
您可以像这样使用它:
@if (\Request::is('*/fields/*','*/documents/*'))
...
@endif
通过这种方式,您可以列出要显示侧边栏的必要值。
更好的方法是制作自定义帮助函数,该函数返回此类值的列表,或者您可以与View Composer共享数组变量。
答案 1 :(得分:1)
您的方法存在一些问题:
Request
门面是难闻的气味; is()
方法来匹配路由也是一种非常不好的做法-它总是导致难以维护的代码:例如,当某人仅将fields
重命名为{{ 1}}?确实,侧边栏停止工作。这就是为什么命名路由并仅通过名称访问它们始终是首选方法。如果侧边栏仅针对特定页面进行更改,并且依赖于视图中的其他内容,则应利用Blade的attributes
指令:
@section
然后在控制器的流路由操作中初始化并返回// in your base.blade.php
<div class="sidebar">
@section('sidebar')
@include('default-sidebar')
@show
</div>
// in your streams.blade.php
@extends('base')
@section('sidebar')
@include('streams-specific-sidebar')
@endsection
而不是基数。这样一来,无需进行streams.blade.php
检查,因为Laravel的路由器将使您的路由与特定的控制器动作匹配,并且这些动作将返回特定的视图,这些视图扩展基本布局,并在需要时覆盖默认部分(在您的情况下为is()
)。 / p>