Laravel之View模組詳解

來源:互聯網
上載者:User
這篇文章主要給大家介紹了關於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 : "預設值"}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.