刀片:在多个子视图中扩展模板

ewo*_*wok 5 laravel blade

我正在使用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


ewo*_*wok 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 --}}
Run Code Online (Sandbox Code Playgroud)

然后,在main.blade.php中,我执行@include('view', ['tab'=>$view]). 这似乎导致content-1和的每个实例content-2都被明确命名,从而允许两个子视图单独实现这些部分。这也应该允许实现此模板的任何其他视图继续运行,而无需进行任何更改。