《PHP實(shí)例:Laravel模板引擎Blade中section的一些標(biāo)簽的區(qū)別介紹》要點(diǎn):
本文介紹了PHP實(shí)例:Laravel模板引擎Blade中section的一些標(biāo)簽的區(qū)別介紹,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
PHP應(yīng)用Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文檔中有關(guān) Blade 的介紹并不詳細(xì),有些東西沒(méi)有寫(xiě)出來(lái),而有些則是沒(méi)有說(shuō)清楚.好比,使用中可能會(huì)遇到這樣的問(wèn)題:
PHP應(yīng)用1.@yield 和 @section 都可以預(yù)定義可替代的區(qū)塊,這兩者有什么區(qū)別呢?
2.@section 可以用 @show, @stop, @overwrite 以及 @append 來(lái)結(jié)束,這三者又有什么區(qū)別呢?
PHP應(yīng)用本文試對(duì)這些問(wèn)題做一個(gè)比擬淺顯但是直觀的介紹.
PHP應(yīng)用@yield 與 @section
PHP應(yīng)用首先,@yield 是不可擴(kuò)展的,如果你要定義的部分沒(méi)有默認(rèn)內(nèi)容讓子模板擴(kuò)展的,那么用 @yield($name, $default) 的形式會(huì)比擬方便,如果你在子模板中并沒(méi)有指定這個(gè)區(qū)塊的內(nèi)容,它就會(huì)顯示默認(rèn)內(nèi)容,如果定義了,就會(huì)顯示你定義的內(nèi)容.非此即彼.
PHP應(yīng)用與之相比, @section 則既可以被替代,又可以被擴(kuò)展,這是最大的區(qū)別.好比:
PHP應(yīng)用上面的例子中,模板用 @yield 和 @section 分別定義了一個(gè)區(qū)塊,然后在子模板中去定義內(nèi)容,由于 @yield 不能被擴(kuò)展,所以即使加上了 @parent 也不起作用,輸出的內(nèi)容只有“新的標(biāo)題”,替換了“默認(rèn)的標(biāo)題”.因此最終生成的頁(yè)面只能是“默認(rèn)的標(biāo)題”或者“新的標(biāo)題”,不能并存.而 @section 定義的部分,由于使用了 @parent 關(guān)鍵字,父模板中的內(nèi)容會(huì)被保存,然后再擴(kuò)展后添加的內(nèi)容進(jìn)去,輸出的內(nèi)容會(huì)是 “默認(rèn)的內(nèi)容 擴(kuò)展的內(nèi)容”.
PHP應(yīng)用官方網(wǎng)站上的文檔中并沒(méi)有涉及 @parent關(guān)鍵字,說(shuō)的是默認(rèn)行為是“擴(kuò)展”,要覆蓋需要用 @override 來(lái)結(jié)束,這是錯(cuò)的,[github 上的最新文檔][docs] 已經(jīng)做了修正.@section 加上 @stop,默認(rèn)是替換(注入),必需用 @parent 關(guān)鍵字才能擴(kuò)展.而@override 關(guān)鍵字實(shí)際上有另外的應(yīng)用場(chǎng)景.
PHP應(yīng)用@show 與 @stop
PHP應(yīng)用接下來(lái)再說(shuō)說(shuō)與 @section 對(duì)應(yīng)的結(jié)束關(guān)鍵字,@show, @stop 有什么區(qū)別呢?(網(wǎng)上的部分文章,以及一些編輯器插件還會(huì)提示 @endsection, 這個(gè)在 4.0 版本中已經(jīng)被移除,雖然向下兼容,但是不建議使用).
PHP應(yīng)用@show 指的是執(zhí)行到此處時(shí)將該 section 中的內(nèi)容輸出到頁(yè)面,而 @stop 則只是進(jìn)行內(nèi)容解析,并且不再處理當(dāng)前模板中后續(xù)對(duì)該section的處理,除非用 @override覆蓋(詳見(jiàn)下一部分).通常來(lái)說(shuō),在首次定義某個(gè) section 的時(shí)候,應(yīng)該用 @show,而在替換它或者擴(kuò)展它的時(shí)候,不應(yīng)該用 @show,應(yīng)該用 @stop.下面用例子說(shuō)明:
PHP應(yīng)用在 layout.master 中,用 @stop 來(lái)結(jié)束 "zoneB",由于整個(gè)模板體系中,沒(méi)有以 @show 結(jié)束的 "zoneB" 的定義,因此這個(gè)區(qū)塊不會(huì)被顯示.而在 page.view 中,用 @show 定義了 'zoneC',這會(huì)在執(zhí)行到這里時(shí)立即顯示內(nèi)容,并依照模板繼承機(jī)制繼續(xù)覆蓋內(nèi)容,因此最終顯示的內(nèi)容會(huì)是:
PHP應(yīng)用從結(jié)果可以看到,zoneB 的內(nèi)容丟失,因?yàn)闆](méi)有用 @show 告訴引擎輸出這部分的內(nèi)容,而 zoneC 的內(nèi)容會(huì)顯示兩次,并且還破壞了 layout.master 的頁(yè)面結(jié)構(gòu),因?yàn)?@show 出現(xiàn)了兩次.
PHP應(yīng)用@append 和 @override
PHP應(yīng)用剛才說(shuō)到了,@override 并不是在子模板中指明內(nèi)容替換父模板的默認(rèn)內(nèi)容,而是另有用途,那么是如何使用呢?這又涉及到一個(gè) section 在模板中可以多次使用的問(wèn)題.也即我們所定義的每一個(gè) section ,在隨后的子模板中其實(shí)是可以多次出現(xiàn)的.好比:
PHP應(yīng)用在上例中,我在父級(jí)模板中只定義了一個(gè)名為 "content" 的 section,而在子模板中三次指定了這個(gè) section 的內(nèi)容. 這個(gè)例子最終的輸出是:
PHP應(yīng)用三次指定的內(nèi)容都顯示出來(lái)了,關(guān)鍵就在于 @append 這個(gè)關(guān)鍵字,它表明“此處的內(nèi)容添加到”,因此內(nèi)容會(huì)不斷擴(kuò)展.而最后用了 @stop,表示這個(gè) section 的處理到此為止.如果在后面繼續(xù)用 @append 或者 @stop 來(lái)指定這個(gè) section 的內(nèi)容,都不會(huì)生效.除非用 @override 來(lái)處理. @override 的意思就是“覆蓋之前的所有定義,以這次的為準(zhǔn)”.好比:
PHP應(yīng)用這個(gè)例子和剛才的類(lèi)似,只不過(guò)最后加了一組定義.最終的輸出會(huì)是:
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP實(shí)例:Laravel模板引擎Blade中section的一些標(biāo)簽的區(qū)別介紹》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/12431.html