刀片继承模板中的相同部分名称

时间:2016-03-17 23:22:55

标签: laravel blade laravel-blade

假设我有三个刀片模板:A,B和C.模板A是全局布局,模板B是某个特定部分的布局,模板C是视图模板。

模板A和B期望分配一个名为content的部分。该部分在视图模板(C)中定义。

这是模板A和B的简化版本:

模板A:

<html>
  <body>
    @yield('content')
  </body>
</html>

模板B:

@extends('template_a')

@section('content')
<div class="sidebar">
  ...
</div>
<div class="content">
  @yield('content')
</div>
@endsection('content')

如您所见,两个模板都输出content部分。我的问题是,在扩展B的视图中,它的内容被简单地忽略了。视图中定义的content部分输出到模板A上的@yield('content')

我想知道是否可以在视图层次结构中传播content部分,即用模板C中定义的值替换模板B中的内容占位符,并将结果替换为{ {1}}占位符在模板A中。

很抱歉,如果我让这个声音太混乱了。我希望你明白我的想法。

提前致谢。

2 个答案:

答案 0 :(得分:9)

我在这里找到了问题的答案:https://laracasts.com/discuss/channels/laravel/trouble-with-blade-section-inheritance?page=1

诀窍是在包含同名@section内的@yield的刀片中使用@overwrite而不是@endsection。

@extends('app')
@section('content')
    {{--Some common code--}}
    @yield('content')
@overwrite

使用@endsection导致生成的视图覆盖中间视图,但使用@overwrite强制包含在内。

在我看来,令人困惑的是,在传统编程中,使用超类方法的指令进入子类(从子类调用超类方法),而在Laravel刀片继承中,它必须放在超类中本身(超类本身声明在重写时不能忽略)。

答案 1 :(得分:1)

只需重命名模板B中的@yield('content') A @endsection(Laravel5)足以结束这些部分。

模板A:

<html>
  <body>
    @yield('body')
  </body>
</html>

模板B:

@section('body')
   <div class="sidebar">
      ...
   </div>
   <div class="content">
      @yield('content')
   </div>
@endsection

模板C:

@section('content')
    <!--yourContent-->
@endsection

通过这种方式,您可以轻松地使用任何其他给定的模板更改模板B以修改正文(即模板D):

@section('body')
   <!-- Some different Body Style -->
      @yield('content')
@endsection

以及您的内容(即模板E):

@section('content')
    <!--some different Content-->
@endsection

修改

模板B没有显示来自模板C的任何数据的原因可能是由模板B引起的无限循环:每次调用该部分(&#39;内容&#39;)时,您也会产生(&#39;内容& #39;)并将模板B插入其自身。