blade 个继承模板中的相同部分名称

Same section name in blade inherited templates

假设我有三个 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 部分,即将模板 B 中的内容占位符替换为模板 C 中定义的值并替换结果in content 占位符在模板 A.

抱歉,如果我让这听起来太混乱了。我希望你能理解我的想法。

提前致谢。

只需重命名模板 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 造成的无限循环:每次调用该部分 ('content') 时,您也会产生 ('content')并将模板 B 插入自身。

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

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

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

使用@endsection 会导致产生的视图覆盖中间视图,但使用@overwrite 会强制包含整个过程。

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