我正在一个单页网站上工作,该网站在" 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语句在其中使用更多逻辑。也许我只是在这个观点中做错了什么?
答案 0 :(得分:0)
您通常希望您的视图尽可能地愚蠢,将逻辑留给控制器,并允许视图仅关注渲染任何给定的内容。这种关注点的分离允许更多可维护的代码,并帮助您避免像您现在面临的问题。
实现你想要实现的,将问题分开的实现,如下所示:
作为一个如何实现这个的简单示例,这里是一个控制器,它构造一个部分数组,然后决定应该删除哪个部分(这是你可以在哪里进行测试“这是由数据库中的管理员禁用的”) )并最终将视图列表提供给视图。
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>