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

时间:2018-04-29 20:38:43

标签: php laravel blade

我正在一个单页网站上工作,该网站在" Home"部分。在这个网站中,我的客户可以选择隐藏或显示页面的任何部分,我已经通过添加一个简单的if语句来检查页面是否可见:

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

@extends('layouts.master')

@section('content')

@include ('homeSection')

@include ('layouts.navigation')

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

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

...

@endsection

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

所有这一切都很完美,它显示了应该可见的页面并隐藏了应隐藏的部分。

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

我的解决方案是创建一个@yield('导航')并在页面底部添加一个@section('导航'),它将包含' ;导航'一旦$ 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('导航')但它仅在@yield('导航')之前有效,而$ sections变量只有homeSection。

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

1 个答案:

答案 0 :(得分:0)

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

实现你想要实现的,将问题分开的实现,如下所示:

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

    作为一个如何实现这个的简单示例,这里是一个控制器,它构造一个部分数组,然后决定应该删除哪个部分(这是你可以在哪里进行测试“这是由数据库中的管理员禁用的”) )并最终将视图列表提供给视图。

    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>