首頁  >  文章  >  後端開發  >  Laravel之View模組詳解

Laravel之View模組詳解

巴扎黑
巴扎黑原創
2017-09-21 10:17:372814瀏覽

這篇文章主要為大家介紹了關於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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn