在另一个视图中包含一个带有变量的视图(Laravel 的 5.6 - Blade)

Include a view with a variable inside another view (Laravel's 5.6 - Blade)

我正在开发一个单页网站,该网站的导航位于 "Home" 部分下方。在这个网站上,我的客户可以选择隐藏或显示页面的任何部分,我通过添加一个简单的 if 语句来检查页面是否应该可见来实现这一点:

我正在加载的视图汇集了单页网站上的所有部分:

@extends('layouts.master')

@section('content')

@include ('homeSection')

@include ('layouts.navigation')

@if ($section1)
@include ('section1')
@endif

@if ($section2)
@include ('section2')
@endif

...

@endsection

唯一没有 show/hide 选项(它将始终显示)的部分是主页部分,我的客户(通过数据库)可以隐藏所有其他部分。

所有这些都运行良好,它显示了应该可见的页面并隐藏了应该隐藏的部分。

我遇到的问题是如何使其导航显示实际隐藏的页面,而不必在每个 for 循环上执行 if 语句。

我的解决方案是制作一个@yield('navigation') 并在页面底部添加一个@section('navigation') 它将@include 'navigation' 视图一次$pages 变量被填充。像这样:

@php ( $sections = array($home) )

@extends('layouts.master')

@section('content')

@include ('home')

@yield ('navigation')

@if ($section1)
@include ('section1')
@php ( array_push($sections, $section1) )
@endif

@if ($section2)
@include ('section2')
@php ( array_push($sections, $section2) )
@endif

...

@endsection

此时 $sections 变量将填充所有可见页面:

@section ('navigation')
@include ('layouts.navigation')
@endsection

当然,我使用 $sections 变量通过 @foreach 语句制作导航栏,唯一的问题是它似乎不起作用。我尝试移动 @section('navigation'),但它仅在它位于 @yield('navigation') 之前时有效,即 $sections 变量只有 homeSection。

我知道我可以直接在导航视图中执行此操作,但我必须通过重新 运行 所有 if 语句在其中使用更多逻辑。也许我只是在这个视图中做错了什么?

您通常希望您的视图尽可能地愚蠢,将逻辑留给控制器,并允许视图只关心呈现给定的任何内容。这种关注点分离允许更多可维护的代码,并帮助您避免像您现在面临的问题。

您要实现的目标的实现,将关注点分开,类似于:

  1. 您的控制器构建了一个应包含的部分列表
  2. 您的控制器将该部分列表传递给您的视图
  3. 您的视图呈现包含该部分列表的导航
  4. 您的视图呈现部分

作为您如何实现它的一个简单示例,这里有一个控制器,它构建一个部分数组,然后决定应该删除哪些部分(您可以在此处对 "is this disabled by the admin in the database" 进行测试)并最终提供该视图的部分列表。

public function index()
{
    $sections = [
        'section1' => 'First Section',
        'section2' => 'Second Section',
        'section3' => 'Third Section',
        'section4' => 'Fourth Section',
    ];

    foreach ($sections as $id => $name) {
        // determine if section should be included or not
        // `shouldBeIncluded` is whatever your truth test is
        if (! shouldBeIncluded($id)) {
            unset($sections[$id]);
        }
    }

    return view('index', ['sections' => $sections]);
}

然后在视图中与部分(即导航或正文)相关的任何地方,您都可以使用该 $sections 数组,您无需担心确定该部分是否应该在那里或不在那里,因为控制器已经做到了。

例如,要包括所有适当的部分,您可以去掉大量的 if 语句并使用一个循环:

@foreach ($sections as $view => $name)
    @include($view)
@endforeach

对于导航,你会做类似的事情:

<ul>
    @foreach ($sections as $view => $name)
        <li><a href="#{{ $view }}">{{ $name }}</a></li>
    @endforeach
</ul>