以下是一个小白的理解
@yield 与 @section
@yield 是不可扩展的,它默认显示主模板的内容,如果你在子模板中指定了这个区块的内容,它就会显示子模板的内容
例如:
主:Sample App - @yield('title')
子:@section('title', '关于页') //Sample App - 关于页
@section 则既可以被替代,又可以被扩展
例如:
@section('content')
默认的内容
@show
@section('content')
@parent
扩展的内容
@stop
@parent 关键字,父模板中的内容会被保留,否则会被替换
@stop 和 @endsection 结束关键字
这两个代表的都一样,@endsection属于老版本,新版本都用@stop,所以建议以后都是用@stop
@show 与 @stop
@show 指的是执行到此处时将该 section 中的内容输出到页面,而 @stop 则只是进行内容解析,并且不再处理当前模板中后续对该section的处理,通常来说,在首次定义某个 section 的时候,应该用 @show,而在替换它或者扩展它的时候,不应该用 @show,应该用 @stop。也就是主模板用@show 子模板用@stop
1.{{-- layout.master --}}
@section('zoneA')
AAA
@show
@section('zoneB')
BBB
@stop
@section('zoneC')
CCC
@show
2.{{-- page.view --}}
@extends('layout.master')
@section('zoneA')
aaa
@stop
@section('zoneB')
bbb
@stop
@section('zoneC')
ccc
@show
输出:
aaa
//为空bbb无输出
ccc
从结果可以看到,zoneB 的内容丢失,因为没有用 @show 告诉引擎输出这部分的内容,而 zoneC 的内容会显示两次,并且还破坏了 layout.master 的页面结构,因为 @show 出现了两次。
@append
扩展,顾名思义就是在原来的基础上添加
例如:
{{-- master --}}
<div>
@yield('content')
</div>
{{-- subview --}}
@extends('master')
@section('content')
加一行内容
@append
@section('content')
再加一行内容
@append
@section('content')
加够了,到此为止吧。
@stop
输出:
<div>
加一行内容
再加一行内容
加够了,到此为止吧。
</div>
三次指定的内容都显示出来了,关键就在于 @append 这个关键字,它表明“此处的内容添加到”,因此内容会不断扩展。而最后用了 @stop,表示这个 section 的处理到此为止。如果在后面继续用 @append 或者 @stop 来指定这个 section 的内容,都不会生效