ホームページ >バックエンド開発 >PHPチュートリアル >Laravelテンプレートエンジンのいくつかのセクションタグの違いの紹介 Blade_PHPチュートリアル

Laravelテンプレートエンジンのいくつかのセクションタグの違いの紹介 Blade_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:07:18867ブラウズ

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

 这篇文章主要介绍了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 --}}

@section('zoneA')
AAA
@show








@section('zoneB')
BBB
@stop








@section('zoneC')
CCC
@show


コードは次のとおりです:


{{-- page.view --}}
@extends('layout.master')

@セクション('ゾーンA')
ああ
@やめて

@セクション('ゾーンB')
BBB
@やめて

@section('zoneC')
CC
@show

layout.masterでは、@stopで「zoneB」を終了します。テンプレートシステム全体に@showで終わる「zoneB」の定義がないため、このブロックは表示されません。 page.view では、「zoneC」が @show で定義されており、実行がここに到達するとすぐにコンテンツが表示され、テンプレート継承メカニズムに従ってコンテンツが上書きされ続けるため、最終的に表示されるコンテンツは次のようになります:

コードをコピーします。コードは次のとおりです:


ccc // page.view から

ああ















CC


結果から、zoneB のコンテンツは失われていることがわかります。これは、@show を使用してエンジンにコンテンツのこの部分を出力するよう指示していないためです。一方、zoneC のコンテンツは 2 回表示され、layout.master のページ構造が失われます。 @show が 2 回出現するため、これも破棄されます。

@append と @override

今述べたように、@override は親テンプレートのデフォルトのコンテンツを置き換えるために子テンプレートのコンテンツを指定するのではなく、別の目的があります。それでは、どのように使用するのでしょうか。これには、セクションがテンプレート内で複数回使用される可能性があるという問題が含まれます。つまり、定義した各セクションは、実際には後続のサブテンプレートに複数回出現する可能性があります。例:

コードは次のとおりです:


{{-- マスター --}}

@yield('コンテンツ')


コードは次のとおりです:


{{-- サブビュー --}}
@extends('マスター')

@section('コンテンツ')
コンテンツを追加します
@追加

@section('コンテンツ')
もう 1 行追加します
@追加

@section('コンテンツ')
十分な量が追加されましたので、今日は終わりにします。
@やめて

上記の例では、親テンプレートに「content」という名前のセクションのみを定義し、子テンプレートでこのセクションのコンテンツを3回指定しました。 この例の最終出力は次のとおりです:

コードは次のとおりです:



コンテンツを追加します
もう 1 行追加します
十分な量が追加されましたので、今日は終わりにします。

3回指定した内容が表示されます。鍵となるのは「ここに内容を追加します」を示す@appendキーワードですので、内容は展開していきます。最後に @stop が付けられており、このセクションの処理がここで終了することを示します。 @append または @stop を使用してこのセクションの内容を指定し続けると、その内容は有効になりません。 @override で処理されない限り。 @override は、「以前の定義をすべて上書きし、この定義が優先される」ことを意味します。例:

コードは次のとおりです:


{{-- マスター --}}

@yield('コンテンツ')
@yield('メッセージ')



コードは次のとおりです:


{{-- マスター --}}

@section('コンテンツ')
コンテンツを追加します
@追加
@section('コンテンツ')
もう 1 行追加します
@追加
@section('コンテンツ')
追加したのはもう十分なので、終わりにしましょう
@やめて
@section('コンテンツ')
もうだめだ、と私は言いました。
@オーバーライド


この例は、一連の定義が最後に追加されることを除いて、今の例と似ています。最終的な出力は次のようになります:

コードは次のとおりです:



もうだめだ、と私は言いました。

したがって、正式なプロジェクトでは、データを走査して出力する必要がある場合に @append を使用できることがあります。しかし、特定のデータを走査して、前のデータがすべて間違っていることが判明した場合はどうすればよいでしょうか。 @override を使用してそれらをすべてオーバーライドします。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/956405.html技術記事この記事では、LaravelテンプレートエンジンBladeの一部のセクションタグの違いを中心に紹介します
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。