首頁  >  文章  >  後端開發  >  Laravel的View模組學習

Laravel的View模組學習

不言
不言原創
2018-06-13 16:34:391192瀏覽

這篇文章主要為大家介紹了關於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 : "預設值"}}

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

Laravel5框架中向視圖傳送array的學習

Laravel 5框架的模型和控制器以及視圖基礎流程的學習

#

以上是Laravel的View模組學習的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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