我正在使用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>
template.blade.php
{{-- formatting stuff --}}
@yield('content 1')
{{-- more formatting stuff --}}
@yield('content-2')
{{-- more formatting stuff --}}
标签 - * blade.php
@extends('template')
@section('content-1')
This is tab [whatever number]
@stop
@section('content-2')
Lorem Ipsum
@stop
这里显而易见的问题是,由于每个子视图都扩展了相同的模板,@yield('content')
存在3次,所有3个子视图都有自己的@section('content')
。似乎正在发生的事情是内容部分的第一个子视图的实现将被置于所有3个产量中。
我的意图很明显。我希望每个包含的子视图都能实现它自己的模板实例,将其内容放在内容部分中,然后进入主页面。可以这样做吗?
如果我将标签 - *。blade.php 文件展平并停止使用该模板,则可以正常使用。这里的问题是我最终会有很多代码重复,最好放在模板中。这是一个紧急选择,但我想这样做&#34;正确&#34;方式。
注意
我试图重新设计这个以避免这个问题,但我真的无法想出另一个解决方案。虽然@include
通常用于引入小的静态片段(标题,页脚等),但我没有读过任何将此视为限制的内容。在我看来,最好的方法是存储每个视图一次,并在需要时将它们拉入主页面,以便我设计它。
答案 0 :(得分:6)
尝试使用@overwrite
命令代替@stop
示例:
@extends('template')
@section('content-1')
Stuff goes here...
@overwrite
@section('content-2')
More stuff goes here...
@overwrite
来源:https://github.com/laravel/framework/issues/1058#issuecomment-17194530
答案 1 :(得分:2)
我想出了一个似乎有用的黑客。在 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 --}}
然后,在 main.blade.php 中,我执行@include('view', ['tab'=>$view])
。这似乎导致content-1
和content-2
的每个实例都被明确命名,允许2个子视图分别实现这些部分。这也应该允许实现此模板的任何其他视图继续运行而不必更改任何内容。