Laravel學(xué)習(xí)教程之View模塊詳解
前言
本文主要是給大家介紹了關(guān)于Laravel中View模塊的相關(guān)資料,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
本文是基于Laravel 5.4版本的路由模塊代碼進(jìn)行分析書(shū)寫(xiě);
文件結(jié)構(gòu)
View模塊的文件格局及功能如下圖所示:

視圖化呈現(xiàn)時(shí)的大概流程:
1、通過(guò)view()方法的調(diào)用,開(kāi)始視圖的呈現(xiàn);
2、首先,查找視圖文件;
(1)依次遍歷路徑,如果文件名帶命名空間(也就是::之前的部分),則采用命名空間對(duì)應(yīng)注冊(cè)的路徑數(shù)組,否則采用全局路徑數(shù)組(在Illuminate\View\FileViewFinder類(lèi)中的paths變量);
(2)結(jié)合當(dāng)前路徑,文件名,后綴名(默認(rèn)順序是blade.php、php、css),判斷文件是否存在;
(3)如果文件不存在,報(bào)異常:對(duì)應(yīng)的view文件不存在;如果文件存在,則根據(jù)后綴名調(diào)用對(duì)應(yīng)的引擎進(jìn)行解析;
3、如果是css后綴,采用file引擎,核心調(diào)用方法是file_get_contents;
4、如果是php后綴,采用php引擎,核心調(diào)用方法是
ob_start(); include $__path; ob_get_clean();
5、如果是blade.php后綴,采用blade引擎;
這個(gè)引擎會(huì)主動(dòng)作緩存處理,如果緩存文件未過(guò)期,則直接調(diào)用緩存文件,否則重新編譯,并通過(guò)sha1生成緩存文件(位于storage/framework/views目錄下);
Blade 引擎編譯
Blade引擎對(duì)文件的編譯,是通過(guò)大量的正則匹配和替換實(shí)現(xiàn)的;
protected $compilers = [
'Comments', // 注釋部分
'Extensions', // 擴(kuò)展部分
'Statements', // 語(yǔ)句塊 (@ 開(kāi)頭的指令)
'Echos', // 輸出
];
protected function parseToken($token) {
list($id, $content) = $token;
if ($id == T_INLINE_HTML) {
foreach ($this->compilers as $type) {
$content = $this->{"compile{$type}"}($content);
}
}
}
在解析的過(guò)程中,Blade會(huì)先使用token_get_all函數(shù)獲取視圖文件中的被PHP解釋器認(rèn)為是HTML(T_INLINE_HTML)的部分,然后依次進(jìn)行Comments、Extensions、Statements 和 Echos部分的正則替換;
注釋部分
核心代碼如下,將注釋符號(hào)“{{-- --}}”包裹的代碼替換為空字符串;
preg_replace("/{{--(.*?)--}}/s", '', $value);
擴(kuò)展部分
通過(guò)extend方法向BladeCompiler添加自定義處理的回調(diào)函數(shù),對(duì)模板內(nèi)容進(jìn)行自定義的文本匹配替換;
核心代碼在Illuminate\View\BladeCompiler文件中,如下:
// 自定義的文本替換擴(kuò)展 數(shù)組
protected $extensions = [];
protected function compileExtensions($value) {
foreach ($this->extensions as $compiler) {
$value = call_user_func($compiler, $value, $this);
}
return $value;
}
指令替換
這部分就是將類(lèi)似@if這種框架自帶的指令和通過(guò)directive方法注冊(cè)的指令進(jìn)行文本替換;
框架提供的指令有以下十部分:
- View\Compilers\Concerns\CompilesAuthorizations: 權(quán)限檢查
指令包括:@can、@cannot、@elsecan、@elsecannot、@endcan、@endcannot - Concerns\CompilesComponents:與組件、插槽相關(guān)
指令包括:@component、@endcomponent、@slot、@endslot - Concerns\CompilesConditionals:與判斷語(yǔ)句相關(guān)
指令包括:@if、@unless、@else、@elseif、@endif、@endunless、@isset、@endisset、@hassection - Concerns\CompilesIncludes:嵌入文件
指令包括:@each、@include、@includeif、@includewhen - Concerns\CompilesInjections:服務(wù)注入
指令包括:@inject - Concerns\CompilesLayouts:和布局相關(guān)
指令包括:@extends、@section、@parent、@yield、@show、@append、@overwrite、@stop、@endsection - Concerns\CompilesLoops:與循環(huán)相關(guān)
指令包括:@forelse、@empty、@endforelse、@endempty、@for、@foreach、@break、@continue、@endfor、@endforeach、@while、@endwhile - Concerns\CompilesRawPhp:與原生PHP語(yǔ)句相關(guān)
指令包括:@php、 @endphp、 @unset - Concerns\CompilesStacks:和堆棧相關(guān)
指令包括:@stack、@push、@endpush、@prepend、@endprepend - Concerns\CompilesTranslations:與本地化翻譯相關(guān)
指令包括:@lang、@endlang、@choice
Echo 替換
echo輸出是針對(duì){!! !!}、{{ }}、{{{ }}}三種括號(hào)進(jìn)行正則替換;
- {!! !!}輸出未轉(zhuǎn)義字符,用于輸出原生帶html標(biāo)簽的值;
- {{ }}正常輸出,支持三目運(yùn)算符替換;
- {{{ }}}輸出轉(zhuǎn)義字符,支持三目運(yùn)算符替換;
三目運(yùn)算符替換是指:{{ $a ?: "默認(rèn)值" }} (或者 {{$a or "默認(rèn)值"}}) 換成 {{ isset($a) ? $a : "默認(rèn)值"}}
參考文章
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
thinkphp框架表單數(shù)組實(shí)現(xiàn)圖片批量上傳功能示例
這篇文章主要介紹了thinkphp框架表單數(shù)組實(shí)現(xiàn)圖片批量上傳功能,結(jié)合實(shí)例形式分析了js前端圖片上傳與后臺(tái)thinkPHP文件處理相關(guān)操作技巧,需要的朋友可以參考下2020-04-04
PHP實(shí)現(xiàn)的漢字拼音轉(zhuǎn)換和公歷農(nóng)歷轉(zhuǎn)換類(lèi)及使用示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的漢字拼音轉(zhuǎn)換和公歷農(nóng)歷轉(zhuǎn)換類(lèi)及使用示例,精心整理自網(wǎng)上的資源,需要的朋友可以參考下2014-07-07
Laravel5.1 框架模型查詢(xún)作用域定義與用法實(shí)例分析
這篇文章主要介紹了Laravel5.1 框架模型查詢(xún)作用域定義與用法,結(jié)合實(shí)例形式分析了laravel5.1定義一個(gè)查詢(xún)作用域及動(dòng)態(tài)的查詢(xún)作用域相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
symfony3.4中根據(jù)角色不同跳轉(zhuǎn)不同頁(yè)面功能
這篇文章主要介紹了symfony3.4中根據(jù)角色不同跳轉(zhuǎn)不同頁(yè)面,在Symfony?3.4中,可以使用安全組件來(lái)實(shí)現(xiàn)控制不同角色跳轉(zhuǎn)到不同頁(yè)面的功能,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
PHP二維數(shù)組矩形轉(zhuǎn)置實(shí)例
下面小編就為大家?guī)?lái)一篇PHP二維數(shù)組矩形轉(zhuǎn)置實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
分享php代碼將360瀏覽器導(dǎo)出的favdb的sqlite數(shù)據(jù)庫(kù)文件轉(zhuǎn)換為html
這篇文章主要介紹了分享php代碼將360瀏覽器導(dǎo)出的favdb的sqlite數(shù)據(jù)庫(kù)文件轉(zhuǎn)換為html,需要的朋友可以參考下2015-12-12

