【问题标题】:Include a view with a variable inside another view (Laravel's 5.6 - Blade)在另一个视图中包含一个带有变量的视图(Laravel 5.6 - Blade)
【发布时间】:2018-10-09 23:47:35
【问题描述】:

我正在开发一个单页网站,该网站的导航位于“主页”部分下方。在这个网站上,我的客户可以选择隐藏或显示页面的任何部分,我通过添加一个简单的 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('navigation') 并在页面底部添加一个@section('navigation'),一旦填充了$pages 变量,它将@include 'navigation' 视图。像这样:

@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 语句来在其中使用更多逻辑。也许我只是在这个视图中做错了什么?

【问题讨论】:

    标签: php laravel blade


    【解决方案1】:

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

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

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

    作为一个简单的例子来说明如何实现这一点,这里有一个控制器,它构造一个部分数组,然后决定应该删除哪些部分(您可以在此处测试“数据库中的管理员是否禁用了此功能” ) 并最终将该部分列表提供给视图。

    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>
    

    【讨论】:

    • 感谢您的回答@sam!我通常这样做,我想我只是在项目快结束时遇到了这个问题,甚至没有想过回到我的控制器,但我应该这样做!很好的答案!
    猜你喜欢
    • 2019-07-18
    • 2019-01-21
    • 2018-06-10
    • 2015-10-27
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多