在另一个视图中包含一个带有变量的视图(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 语句在其中使用更多逻辑。也许我只是在这个视图中做错了什么?
您通常希望您的视图尽可能地愚蠢,将逻辑留给控制器,并允许视图只关心呈现给定的任何内容。这种关注点分离允许更多可维护的代码,并帮助您避免像您现在面临的问题。
您要实现的目标的实现,将关注点分开,类似于:
- 您的控制器构建了一个应包含的部分列表
- 您的控制器将该部分列表传递给您的视图
- 您的视图呈现包含该部分列表的导航
- 您的视图呈现部分
作为您如何实现它的一个简单示例,这里有一个控制器,它构建一个部分数组,然后决定应该删除哪些部分(您可以在此处对 "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>
我正在开发一个单页网站,该网站的导航位于 "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 语句在其中使用更多逻辑。也许我只是在这个视图中做错了什么?
您通常希望您的视图尽可能地愚蠢,将逻辑留给控制器,并允许视图只关心呈现给定的任何内容。这种关注点分离允许更多可维护的代码,并帮助您避免像您现在面临的问题。
您要实现的目标的实现,将关注点分开,类似于:
- 您的控制器构建了一个应包含的部分列表
- 您的控制器将该部分列表传递给您的视图
- 您的视图呈现包含该部分列表的导航
- 您的视图呈现部分
作为您如何实现它的一个简单示例,这里有一个控制器,它构建一个部分数组,然后决定应该删除哪些部分(您可以在此处对 "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>