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

时间:2019-06-13 07:34:02

标签: 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')

您可以看到,到目前为止,我已经使用以下条件检查是否应显示特定的侧边栏:

@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;

但是,我不确定如何实现此功能-还是有更好的方法?

2 个答案:

答案 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>