Laravel學習教程之View模塊詳解

更新:2017-10-25    編輯:春薇    來源:哥乖整理    人氣:加載中...    字號:|

前言

本文主要是給大家介紹了關于LaravelView模塊的相關資料,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

本文是基于Laravel 5.4版本的路由模塊代碼進行分析書寫;

文件結構

View模塊的文件格局及功能如下圖所示:

Laravel學習教程之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輸出是針對{!! !!}、{{ }}、{{{ }}}三種括號進行正則調換;

    三目運算符調換是指:{{ $a ?: "默認值" }} (或者 {{$a or "默認值"}}) 換成 {{ isset($a) ? $a : "默認值"}}

    參考文章

    Laravel 模板引擎(Blade)原理簡析

    Laravel 5.4 文檔 前端 —— Blade模板

    總結



    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)

    站點導航

    您可能在找這些
    黑龙江快乐十分走势图