PHP/Laravel-有条件地显示刀片视图

PHP/Laravel-有条件地显示刀片视图,php,laravel,Php,Laravel,我有以下app.blade.php模板: <!-- Sidebar Area --> @if (\Request::is('*/fields*')) @include('streams.nav.editor-menu') @else @include('streams.nav.menu') @endif <!-- Content area --> @yield('content') 上面只是检查路由是否包含字段路由,定义如下: Route::resou

我有以下
app.blade.php
模板:

<!-- Sidebar Area -->
@if (\Request::is('*/fields*'))
    @include('streams.nav.editor-menu')
@else
    @include('streams.nav.menu')
@endif

<!-- Content area -->
@yield('content')
上面只是检查路由是否包含
字段
路由,定义如下:

Route::resource('streams/{stream}/fields', 'Stream\FieldsController');
现在,我需要在另一个路由资源上使用此侧边栏:

Route::resource('streams/{stream}/documents', 'Stream\DocumentsController');
如果语句:

@if (\Request::is('*/fields*') or \Request::is('*/documents*')) 
...
@endif
然而,我想接下来我需要在这个声明中添加更多的路线

解决这个问题的最佳方法是什么?是否有可能在
控制器
或甚至是
模型
中声明这一点?比如:

//Fields.php
/**
 * Specifies whether the editor menu should be shown or not.
 *
 * @return bool
 */

$sidebarEditor = true;

但是,我有点不确定如何实现这一点,或者是否有更好的方法?

您可以这样使用它:

@if (\Request::is('*/fields/*','*/documents/*')) 
...
@endif
通过这种方式,您可以列出要在侧边栏中显示的必要值


更好的方法是使用自定义的helper函数返回这些值的列表,或者您可以与view composer共享一个数组变量。

您的方法存在一些问题:

  • 用控制器的逻辑重载视图是一种不好的做法。 理想情况下,您希望只使用传递到视图中的值 因此,你自己访问
    请求
    门面是一种难闻的气味
  • 使用
    is()?没错,侧边栏停止工作了。这就是为什么命名路由和仅通过名称访问路由应该始终是首选方法的原因
如果侧边栏仅针对特定页面进行更改,并且取决于视图中的其他内容,则应使用Blade的
@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
//在base.blade.php中
@节(“侧栏”)
@包括('default-sidebar')
@展示
//在streams.blade.php中
@扩展('基')
@节(“侧栏”)
@包括('streams-specific-sidebar')
@端部

然后在streams路由的控制器操作中初始化并返回
streams.blade.php
,而不是基本路径。否
is()
这样检查是必需的,因为Laravel的路由器会将您的路线与特定的控制器操作相匹配,并且这些操作将返回特定的视图,这些视图会扩展基本布局,在需要时覆盖默认部分(
“侧栏”
),然而,这个列表可能会变得很长,很难阅读。我想知道是否有一个干净的解决方案可以将其从视图文件中移出,并可能移动到模型/控制器中?@oliverbj您可以使用helper函数让这样的元素列表或视图生成器通过viewsAh共享公共变量,这是一个非常干净的方法!唯一的“缺点”是,我必须在每个需要编辑器侧栏的页面上重复
@section('sidebar')@include('streams-specific-sidebar')@endsection
,但仍然不确定这是否是一种不好的做法?@oliverbj您不必这样做,这完全取决于您如何构建模板层次结构。例如,您可以使用
侧栏中的
@include('streams.nav.menu')
定义基本视图,并使用
@include('streams.nav.editor menu')
定义另一个基本视图。然后,所有其他视图都可以根据所需的侧边栏类型扩展其中一个视图。唯一的缺点是,一旦模板之间有不同的更改部分,层次结构就没有那么灵活了。然后,与其使用所有可能的组合生成大量冗余模板,不如将这些块的分辨率分离到
ViewComposer
。例如,只需在基本视图中编写
@inculde($sidebar)
,然后根据应该存在的侧边栏为不同的视图分配不同的视图生成器。
// 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