這篇文章主要為大家介紹了關於Laravel學習教程之View模組的相關資料,文中透過範例程式碼將View模組介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
前言
本文主要是跟大家介紹了Laravel中View模組的相關資料,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
本文是基於Laravel 5.4版本的路由模組程式碼進行分析書寫;
#檔案結構
##View模組的檔案格局及功能如下圖所示:
#視圖化呈現時的大約流程:
1 、透過view()方法的調用,開始視圖的呈現;
2、首先,尋找視圖檔案;
(1)依序遍歷路徑,如果檔案名稱帶命名空間(也就是::之前的部分),則採用命名空間對應註冊的路徑數組,否則採用全域路徑數組(在Illuminate\View\FileViewFinder類別中的paths變數);
#(2)結合目前路徑,檔名,後綴名(預設順序是blade.php、php、css),判斷檔案是否存在;
(3)如果檔案不存在,報異常:對應的view檔案不存在;如果檔案存在,則根據後綴名呼叫對應的引擎進行解析;
3、如果是css後綴,採用file引擎,核心呼叫方法是file_get_contents;
4、如果是php後綴,採用php引擎,核心呼叫方法是
#
ob_start();
include $__path;
ob_get_clean();
登入後複製
5、如果是blade.php後綴,採用blade引擎;
這個引擎會主動作快取處理,如果快取檔案未過期,則直接呼叫快取文件,否則重新編譯,並透過sha1產生快取檔案(位於storage/framework/ views目錄下);
Blade 引擎編譯
Blade引擎對檔案的編譯,是透過大量的正規則匹配和替換實現的;
protected $compilers = [
'Comments', // 注释部分
'Extensions', // 扩展部分
'Statements', // 语句块 (@ 开头的指令)
'Echos', // 输出
];
protected function parseToken($token) {
list($id, $content) = $token;
if ($id == T_INLINE_HTML) {
foreach ($this->compilers as $type) {
$content = $this->{"compile{$type}"}($content);
}
}
}
登入後複製
在解析的過程中,Blade會先使用token_get_all函數來取得視圖檔案中的被PHP解釋器認為是HTML(T_INLINE_HTML)的部分,然後依序進行Comments、Extensions、Statements 和Echos部分的正規取代;
註解部分
##核心程式碼如下,將註解符號「{{ -- --}}」包裹的程式碼替換為空字串;
preg_replace("/{{--(.*?)--}}/s", '', $value);
登入後複製
#擴展部分
透過extend方法為BladeCompiler新增自訂處理的回呼函數,對範本內容進行自訂的文字匹配替換;
核心程式碼在Illuminate\View\BladeCompiler檔案中,如下:
// 自定义的文本替换扩展 数组
protected $extensions = [];
protected function compileExtensions($value) {
foreach ($this->extensions as $compiler) {
$value = call_user_func($compiler, $value, $this);
}
return $value;
}
登入後複製
指令替換
這部分就是將類似@if這種框架自帶的指令和透過directive方法註冊的指令進行文字替換;
框架提供的指令有以下十部分:
View\Compilers\Concerns\CompilesAuthorizations: 權限檢查-
指令包括:@can、@cannot、@elsecan、@elsecannot、@endcan、@endcannot
Concerns\CompilesComponents:與元件、插槽相關-
指令包括:@component、@endcomponent、@slot、@endslot
#Concerns\CompilesConditionals:與判斷語句相關-
指令包括:@if、@unless、@else、@elseif、@endif、@endunless、@isset、@endisset、@hassection
Concerns\CompilesIncludes:嵌入檔案-
指令包括:@each、@include、@includeif、@includewhen
#Concerns\CompilesInjections:服務注入-
指令包括:@inject
Concerns\CompilesLayouts:和佈局相關-
指令包括:@extends、@section、@parent、@yield、@show、@append、@overwrite、@stop、@endsection
Concerns\CompilesLoops:與循環相關-
指令包括:@forelse、@empty、@endforelse、@endempty、@for、@foreach、@break、@continue、@endfor、@endforeach、@while、@endwhile
-
Concerns\CompilesRawPhp:與原生PHP語句相關
指令包括:@php、 @endphp、 @unset
-
Concerns\CompilesStacks:和堆疊相關
指令包括:@stack、@push、@endpush、@prepend、@endprepend
-
Concerns\CompilesTranslations:與在地化翻譯相關
指令包括:@lang、@endlang、@choice
Echo 取代
echo輸出是針對{!! !!} 、{{ }}、{{{ }}}三種括號進行正規替換;
-
#{!! !!}輸出未轉義字符,用於輸出原生帶html標籤的值;###
{{ }}正常輸出,支援三目運算子替換;
#{{ }}}輸出轉義字符,支援三目運算符替換;
三目運算子替換是指:{{ $a ?: "預設值" }} (或{{$a or "預設值"}}) 換成{{ isset($a) ? $a : "預設值"}}
以上是Laravel之View模組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!