Laravel模板引擎Blade中section的一些标签的区别介绍

2013-11-29  来源:本站原创  分类:php技巧  人气:14 

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

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

[email protected] 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?
[email protected] 可以用 @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>

三次指定的内容都显示出来了,关键就在于 @append 这个关键字,它表明“此处的内容添加到”,因此内容会不断扩展。而最后用了 @stop,表示这个 section 的处理到此为止。如果在后面继续用 @append 或者 @stop 来指定这个 section 的内容,都不会生效。除非用 @override 来处理。 @override 的意思就是“覆盖之前的所有定义,以这次的为准”。比如:

复制代码 代码如下:

{{-- master --}}

<div>

  @yield('content')

    @yield('message')

</div>

复制代码 代码如下:

{{-- master --}}

<div>

  @section('content')

    加一行内容

    @append

    @section('content')

    再加一行内容

    @append

    @section('content')

    加够了,结束吧

    @stop

    @section('content')

    都不要了,我说的。

    @override

</div>

这个例子和刚才的类似,只不过最后加了一组定义。最终的输出会是:

复制代码 代码如下:

<div>

  都不要了,我说的。

</div>

所以,在正式的项目中,有时候需要对数据进行遍历输出的,可以使用 @append,而如果遍历到了某个数据发现前面的都错了呢?用 @override 就可以全部推翻。

相关文章
  • Laravel模板引擎Blade中section的一些标签的区别介绍 2013-11-29

    这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,本文讲解了@yield 与 @[email protected] 与 @[email protected] 和 @override的区别,需要的朋友可以参考下 Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: [email protected] 和 @section 都可以预定义可替代的区块,这两者有什么区别呢?

  • js中 关于undefined和null的区别介绍 2015-02-13

    本篇文章小编将为大家介绍,js中 关于undefined和null的区别,有需要的朋友可以参考一下 当声明一个变量未赋值一个变量没有声明的时候都是undefined类型的数据 js变量在使用之前也必须先进行声明 使用了一个未定义的变量x就会报错. 如何判断一个变量是否能用: 第一种方法:if(typeof x=='undefined') var n=100; n=new Date(); n=null; null表示的是一个明确的已经知道的值,是一个空对象 第二种方法: if(typeof(y)!

  • 模板引擎cheetah中关于中文编码问题,两种解决办法 2013-08-15

    1.编码统一 在所有模板的开头增加 #encoding utf-8 保证模板处在的编码环境一致: 例如python文件中 #!/usr/bin/python -- coding: utf-8 -- templateDef_absolute = ''' encoding utf-8 ''' 这样可以在templateDef_absolute中增加中文字符串 2.将所有含中文字符的字符串全部加入nameSpace中以变量形式嵌入.

  • VBS中CreateObject和WScript.CreateObject的区别介绍 2014-04-11

    很多VBS新手都很困惑CreateObject和WScript.CreateObject有什么区别,为什么一些代码中用CreateObject,而另一些却用WScript.CreateObject CreateObject和WScript.CreateObject的区别一: CreateObject是VBS的内置函数,属于语言的一部分:而WScript.CreateObject是Windows脚本宿主(wscript.exe和cscript.exe)提供的WScript对象的方法.类似于批处理中

  • 在javaScript中关于submit和button的区别介绍 2014-06-16

    submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了,submit和button,二者都以按钮的形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上 submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成button,即取消其自动提交的行为,否则,将会造成提交两次的效果,对于动态网页来说,也就是对数据库操作两次

  • PHP中file_exists与is_file,is_dir的区别介绍 2014-10-09

    很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢 很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢? PHP的 file_exists = is_dir + is_file 它既可以判断文件是否存在,又可以判断目录是否存在.

  • delphi中exit,abort,break,continue的区别介绍 2015-04-28

    本文详细介绍下delphi中表示跳出的有break,continue, exit,abort, halt, runerror的区别,感兴趣的朋友可以参考下哈,希望对你学习跳出有所帮助 delphi中表示跳出的有break,continue, exit,abort, halt, runerror. 1.break 强制退出循环(只能放在循环中),用于从For语句,while语句或repeat语句中强制退出. 2.continue 用于从For语句,while语句或repeat语句强行结束本次称称循

  • smarty模板引擎从配置文件中获取数据的方法 2013-12-12

    这篇文章主要介绍了smarty模板引擎从配置文件中获取数据的方法,涉及config_load载入配置文件及相关的读取技巧,需要的朋友可以参考下 本文实例讲述了smarty模板引擎从配置文件中获取数据的方法.分享给大家供大家参考.具体如下: 当某个变量值,不希望在程序中写死时,就可以把该变量写到配置文件里,并从中获取(常见的配置样式). 第一步:先写一个配置文件,如数据库的 db.conf,后缀名conf可以随便写,db.ini也行.文件中内容的格式需要固定:key="值",每一行后面不

  • smarty模板引擎从php中获取数据的方法 2014-01-08

    这篇文章主要介绍了smarty模板引擎从php中获取数据的方法,涉及smarty变量与php代码的混编技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了smarty模板引擎从php中获取数据的方法.分享给大家供大家参考.具体如下: smarty可以分配($smarty->assign)的变量类型:所有php支持的数据类型--基本数据类型.复合数据类型.特殊数据类型(具体见smarty相关手册). 操作/显示文件:index.php <?php //创建smarty对象 requi

  • 在Yii框架中使用PHP模板引擎Twig的例子 2014-02-15

    这篇文章主要介绍了在Yii框架中使用PHP模板引擎Twig的例子,Twig是一款简洁的PHP模板引擎,在此小编也介绍一下,需要的朋友可以参考下 Twig是一款快速.安全.灵活的PHP模板引擎,它内置了许多filter和tags,并且支持模板继承,能让你用最简洁的代码来描述你的模板.他的语法和Python下的模板引擎Jinjia以及Django的模板语法都非常像. 比如我们在PHP中需要输出变量并且将其进行转义时,语法比较累赘: <?php echo $var ?> <?php echo

  • PHP中MVC模式的模板引擎开发经验分享 2014-08-03

    MVC是模型(Model).视图(View)和控制(Controller)的缩写,PHP中采用MVC模式的目的是实现Web系统的职能分工,通俗的说就是把业务逻辑处理从用户界面视图中分离出来. 使Web系统的开发与维护更加方便,从而有效的节省人力物力,受到了越来越多企业的青眯. 模板引擎是MVC模式建立过程的重要方法,开发者可以设计一套赋予含义的标签,通过技术解析处理有效的把数据逻辑处理从界面模板中提取出来,通过解读标签的含义把控制权提交给相应业务逻辑处理程序,从而获取到需要的数据,以模板设计的形

  • smarty模板引擎中内建函数if.elseif和else的使用方法 2014-08-21

    这篇文章主要介绍了smarty模板引擎中内建函数if.elseif和else的使用方法,通过两个示例分析了if.elseif和else的使用技巧,需要的朋友可以参考下 本文实例讲述了smarty内建函数if.elseif与else的使用方法,分享给大家供大家参考.具体如下: 模板文件:temp.tpl <html> <h2>smarty内建函数if.elseif和else的使用</h2> <p style="color:red">实例1-

  • PHP针对常规模板引擎中与CSS/JSON冲突的解决方法 2014-10-09

    这篇文章主要介绍了PHP针对常规模板引擎中与CSS/JSON冲突的解决方法,非常实用的技巧,需要的朋友可以参考下 本文实例讲述了PHP针对常规模板引擎中与CSS/JSON冲突的解决方法,有一定的实用价值,具体分析如下: 本文主要针对对象为Smarty与Dwoo 在Smarty中经常会出现和CSS/JS的语法存在冲突的情况,因为二者都需要使用大括号{}.虽然可以改Smarty的界定符,但你在一个现存系统中,去修改所有相关代码,是不划算的.解决方法如下: 1. 避免同时出现 通过外部引用的方式避免.

  • smarty模板引擎中自定义函数的方法 2015-01-02

    这篇文章主要介绍了smarty模板引擎中自定义函数的方法,实例分析了自定义函数的定义.注册及调用技巧,需要的朋友可以参考下 本文实例讲述了smarty 自定义函数方法,分享给大家供大家参考.具体如下: 本实例目的:输出 times 次 con的内容(输出4次hello world) 文件1: <?php //创建smarty对象 require_once("./libs/Smarty.class.php"); $smarty = new Smarty(); //自定义一个函数 /

  • smarty模板引擎中变量及变量修饰器用法实例 2015-01-24

    这篇文章主要介绍了smarty模板引擎中变量及变量修饰器用法,实例分析了smarty模板引擎中常见变量.变量修饰器及常量的具体用法,需要的朋友可以参考下 本文实例讲述了smarty变量及变量修饰器的应用.分享给大家供大家参考.具体如下: 模板文件:temp.htm: {config_load file="foo.conf"} {$name.na1|cat:$name['na2']} {$name['na1']|cat:'与'|cat:$name.na2} {foreach from=$

  • thinkphp3.0基础如何在模板引擎中输出系统变量和系统常量 2012-12-20

    我们在上一节讲了在 "thinkphp 中如何修改模版标签定界符", 达到防止与JS混淆的目的.今天接着讲thinkphp的模板引擎,无忧主机(www.51php.com)小编准备今天讲在模板里面输出系统变量和系统 常量,大家都知道,我们在前面讲了给模板分配变量,然后在模板里面通过{$name}的方式来获取.这些称为常规变量,小编今天给大家讲的系统变量是在系 统内置的变量,不需要我们赋值分配.系统变量的输出必须以$Think.打头,也是用标签的方式来写,我们常见的系统变量包括 serv

  • 在java程序中使用模板引擎FreeMarker 2013-01-17

    程序使用的模板: $ {name},你好!$ {msg} 这里类似于$ {}的就是动态的内容,称作"插值". 为了使用FreeMarker来将数据模型中的值合并到模板文件中,可按如下步骤进行: 1,创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例 2,使用Configuration实例来生成Template实例,同进需要指定使用的模板文件 3,填充数据模型,数据模型就是一个Map对象 4,调用Template实例的process方法

  • 在Expressjs4.0中使用dustjs模板引擎 2014-10-19

    引言 dustjs是一款js模板,最早由个人开发维护,后来由linkin接手,发展的更加迅速,说实话js模板这块有很多选择,都非常优秀,和paypal的选择一样,最终我使用dustjs作为我的首选模板语言.dustjs中文的文档非常少,所以在国内的使用不是很多,这里几篇博文有对dustjs语法基本的介绍Dust.js语法简介(一),Dust.js语法简介(二),Dust.js语法简介(三) express4.0 默认的模板引擎是jade,jade 刚刚开始用的时候感觉像python,有严格的语法

  • PHP模板引擎SMARTY 2014-05-21

    用PHP实现MVC开发模式的逻辑层和表示层有多种模板引擎可供选择, 但是官方引擎SMARTY诞生后,选择就有了变化.它的理念和实现都是 相当"前卫"的.本文主要讨论SMARTY之于其他模板引擎的不同特点, 简要介绍了该引擎的安装及使用,并用一个小的测试案例对比了 SMARTY和PHPLIB template的速度和易用性. 一.MVC需要模板 MVC最早是在SmallTalk语言的开发过程中总结出的一种设计模式,MVC分别代 表了"模型"."视图"

  • [PHP]模板引擎Smarty深入浅出介绍 2014-11-12

    Smarty介绍 什么是模版引擎 不知道从什么时候开始,有人开始对 HTML 内嵌入 Server Script 觉得不太满意.然而不论是微软的 ASP 或是开放源码的 PHP,都是属于内嵌 Server Script 的网页伺服端语言.因此也就有人想到,如果能把程序应用逻辑 (或称商业应用逻辑) 与网页呈现 (Layout) 逻辑分离的话,是不是会比较好呢? 其实这个问题早就存在已久,从交互式网页开始风行时,不论是 ASP 或是 PHP 的使用者都是身兼程序开发者与视觉设计师两种身份.可是通常