中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel中View模塊的示例分析

發布時間:2021-08-06 09:49:57 來源:億速云 閱讀:145 作者:小新 欄目:開發技術

這篇文章主要介紹Laravel中View模塊的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

文件結構

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輸出是針對{!! !!}、{{ }}、{{{ }}}三種括號進行正則替換;

  • {!! !!}輸出未轉義字符,用于輸出原生帶html標簽的值;

  • {{ }}正常輸出,支持三目運算符替換;

  • {{{ }}}輸出轉義字符,支持三目運算符替換;

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

以上是“Laravel中View模塊的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

七台河市| 临高县| 高邮市| 富川| 航空| 三江| 兴隆县| 江山市| 德令哈市| 哈巴河县| 高密市| 玉树县| 友谊县| 夏河县| 桐庐县| 石门县| 元江| 沁水县| 遵义县| 平罗县| 三河市| 漳州市| 夏津县| 余干县| 鄱阳县| 泰兴市| 双城市| 阜平县| 乡宁县| 昌乐县| 绥芬河市| 天镇县| 策勒县| 大方县| 鹤山市| 沙洋县| 会昌县| 固阳县| 渝中区| 太康县| 吉木萨尔县|