我正在使用Blade将多个子视图包含到刀片应用程序中的一组选项卡中.所有子视图具有相同的整体结构(侧边栏和主要部分).因此,我创建了一个模板,每个子视图都扩展了模板.这是结构:
Main.blade.php
<div id="tabs">
<ul>
@foreach($views as $view)
<li><a href="#{{$view}}">{{$view}}</a></li>
@endforeach
</ul>
@foreach($views as $view)
<div id="{{$view}}">
@include($view)
</div>
@endforeach
</div>
Run Code Online (Sandbox Code Playgroud)
template.blade.php
{{-- formatting stuff --}}
@yield('content 1')
{{-- more formatting stuff --}}
@yield('content-2')
{{-- more formatting stuff --}}
Run Code Online (Sandbox Code Playgroud)
标签 - *blade.php
@extends('template')
@section('content-1')
This is tab [whatever number]
@stop
@section('content-2')
Lorem Ipsum
@stop
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是,当每个子视图扩展相同的模板时,@yield('content')存在3次,并且所有3个包含的子视图都有自己的子视图@section('content').似乎正在发生的事情是,第一个子视图的内容部分的实现将被置于所有3个产量中.
我的意图很明显.我希望每个包含的子视图都实现它自己的模板实例,将它的内容放在内容部分中,然后进入主页面.可以这样做吗?
如果我展平选项卡 - *.blade.php文件并停止使用该模板,它可以正常工作.这里的问题是我最终会有很多代码重复,最好放在模板中.这是一个紧急选择,但我想以"正确"的方式做到这一点.
注意
我试图重新设计这个以避免这个问题,但我真的无法想出另一个解决方案.虽然@include通常用于拉入小的静态片段(标题,页脚等),但我没有读过任何声明这是限制的内容.在我看来,最好的方法是存储每个视图一次,并在需要时将它们拉入主页面,这就是我设计它的方式.
小智 6
尝试使用@overwrite命令而不是@stop
例:
@extends('template')
@section('content-1')
Stuff goes here...
@overwrite
@section('content-2')
More stuff goes here...
@overwrite
Run Code Online (Sandbox Code Playgroud)
资料来源:https://github.com/laravel/framework/issues/1058#issuecomment-17194530
我想出了一个似乎有效的技巧。在template.blade.php中,我使用以下内容:
{{-- formatting stuff --}}
@yield(isset($tab) ? "content-1-$tab" : 'content-1')
{{-- more formatting stuff --}}
@yield(isset($tab) ? "content-2-$tab" : 'content-2')
{{-- more formatting stuff --}}
Run Code Online (Sandbox Code Playgroud)
然后,在main.blade.php中,我执行@include('view', ['tab'=>$view]). 这似乎导致content-1和的每个实例content-2都被明确命名,从而允许两个子视图单独实现这些部分。这也应该允许实现此模板的任何其他视图继续运行,而无需进行任何更改。