laravel中模板继承深入解析

这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @section、@show 与 @stop、@append 和 @override的区别,需要的朋友可以参考下


Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚。比如,使用中可能会遇到这样的问题:


1.@yield 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?
2.@section 可以用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢?
本文试对这些问题做一个比较浅显但是直观的介绍。


@yield 与 @section
首先,@yield 是不可扩展的,如果你要定义的部分没有默认内容让子模板扩展的,那么用 @yield($name, $default) 的形式会比较方便,如果你在子模板中并没有指定这个区块的内容,它就会显示默认内容,如果定义了,就会显示你定义的内容。非此即彼。
与之相比, @section 则既可以被替代,又可以被扩展,这是最大的区别。比如:
 
代码如下:

{{-- layout.master --}}

@yield('title','默认标题')

@section('content')默认的内容

@show
 
 
代码如下:

{{-- home.index --}}

@extends('layout.master')

@section('title')

@parent新的标题

@stop

@section('content')

@parent扩展的内容

@stop
 
上面的例子中,模板用 @yield 和 @section 分别定义了一个区块,然后在子模板中去定义内容,由于 @yield 不能被扩展,所以即使加上了 @parent 也不起作用,输出的内容只有“新的标题”,替换了“默认的标题”。因此最终生成的页面只能是“默认的标题”或者“新的标题”,不能并存。而 @section 定义的部分,由于使用了 @parent 关键字,父模板中的内容会被保留,然后再扩展后添加的内容进去,输出的内容会是
 “默认的内容 扩展的内容”。


官方网站上的文档中并没有涉及 @parent关键字,说的是默认行为是“扩展”,要覆盖需要用 @override 来结束,这是错的,[github 上的最新文档][docs] 已经做了修正。@section 加上 @stop,默认是替换(注入),必须用 @parent 关键字才能扩展。而@override 关键字实际上有另外的应用场景。


@show 与 @stop
接下来再说说与 @section 对应的结束关键字,@show, @stop 有什么区别呢?(网上的部分文章,以及一些编辑器插件还会提示 @endsection,这个在 4.0 版本中已经被移除,虽然向下兼容,但是不建议使用)。


@show 指的是执行到此处时将该 section 中的内容输出到页面,而 @stop 则只是进行内容解析,并且不再处理当前模板中后续对该section的处理,除非用 @override覆盖(详见下一部分)。通常来说,在首次定义某个 section 的时候,应该用 @show,而在替换它或者扩展它的时候,不应该用 @show,应该用 @stop。下面用例子说明:


代码如下:

{{-- layout.master --}}

<div id="zoneA">

@section('zoneA')AAA

@show</div><div id="zoneB">

@section('zoneB')BBB

@stop</div><div id="zoneC">

@section('zoneC')CCC

@show

</div>
 
 
代码如下:

{{-- page.view --}}

@extends('layout.master')

@section('zoneA')aaa

@stop@section('zoneB')bbb

@stop@section('zoneC')ccc

@show
 
在 layout.master 中,用 @stop 来结束 "zoneB",由于整个模板体系中,没有以 @show 结束的 "zoneB" 的定义,因此这个区块不会被显示。而在 page.view 中,用 @show 定义了 'zoneC',这会在执行到这里时立即显示内容,并按照模板继承机制继续覆盖内容,因此最终显示的内容会是:
 
复制代码 代码如下: ccc // 来自 page.view

<div class="zoneA">aaa</div>

<div class="zoneB"></div>

<div class="zoneC">ccc</div>
 
从结果可以看到,zoneB 的内容丢失,因为没有用 @show 告诉引擎输出这部分的内容,而 zoneC 的内容会显示两次,并且还破坏了 layout.master 的页面结构,因为 @show 出现了两次。


@append 和 @override
刚才说到了,@override 并不是在子模板中指明内容替换父模板的默认内容,而是另有用途,那么是如何使用呢?这又涉及到一个 section 在模板中可以多次使用的问题。也即我们所定义的每一个 section ,在随后的子模板中其实是可以多次出现的。比如:
 
代码如下:

{{-- master --}}

<div>@yield('content')</div>
 
 
代码如下:

{{-- subview --}}

@extends('master')

@section('content')加一行内容

@append@section('content')再加一行内容

@append@section('content')加够了,到此为止吧。

@stop
 
在上例中,我在父级模板中只定义了一个名为 "content" 的 section,而在子模板中三次指定了这个 section 的内容。 这个例子最终的输出是:
 
代码如下: <div>加一行内容再加一行内容加够了,到此为止吧。</div>

---------------------

转载于:https://my.oschina.net/u/2607135/blog/2222070

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Laravel是一款流行的PHP框架,也支持模板继承Laravel使用了Blade模板引擎来实现模板继承。在Laravel模板继承的基本结构包括三个文件: 1. 基础模板(layout.blade.php):定义整个网站的布局和结构,包括头部、导航、侧边栏、底部等。基础模板使用`@yield`指令来定义占位符,这些占位符可以在子模板被替换成具体的内容。 2. 子模板(child.blade.php):继承基础模板并添加自己的内容。子模板使用`@extends`指令来声明继承关系,并使用`@section`指令来定义具体内容。 3. 具体内容(content.blade.php):包含了子模板所需的具体内容。具体内容必须通过`@section`指令来定义,并且必须与基础模板的占位符对应。 一个简单的例子如下: 基础模板(layout.blade.php): ```html <html> <head> <title>@yield('title')</title> </head> <body> <div class="container"> @yield('content') </div> </body> </html> ``` 子模板(child.blade.php): ```html @extends('layout') @section('title', 'Page Title') @section('content') <p>This is my page content.</p> @endsection ``` 具体内容(content.blade.php): ```html @extends('child') @section('content') <p>This is my updated page content.</p> @endsection ``` 在这个例子,具体内容(content.blade.php继承了子模板(child.blade.php),子模板继承了基础模板(layout.blade.php)。具体内容重新定义了`@section('content')`指令,使得其覆盖了子模板的定义。最终渲染的页面将会是: ```html <html> <head> <title>Page Title</title> </head> <body> <div class="container"> <p>This is my updated page content.</p> </div> </body> </html> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值