Laravel学习教程之View模块详解


Posted in PHP onSeptember 18, 2017

前言

本文主要是给大家介绍了关于Laravel中View模块的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

本文是基于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输出是针对{!! !!}、{{ }}、{{{ }}}三种括号进行正则替换;

  • {!! !!}输出未转义字符,用于输出原生带html标签的值;
  • {{ }}正常输出,支持三目运算符替换;
  • {{{ }}}输出转义字符,支持三目运算符替换;

三目运算符替换是指:{{ $a ?: "默认值" }} (或者 {{$a or "默认值"}}) 换成 {{ isset($a) ? $a : "默认值"}}

参考文章

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

Laravel 5.4 文档 前端 —— Blade模板

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
javascript some()函数用法详解
Nov 13 PHP
php中session与cookie的比较
Jan 27 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
php实现网站留言板功能
Nov 04 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
PHP+MYSQL实现读写分离简单实战
Mar 13 PHP
PHP截取发动短信内容的方法
Jul 04 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
Nov 07 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 PHP
php制作圆形用户头像的实例_自定义封装类源代码
Sep 18 #PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 #PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 #PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 #PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
Sep 16 #PHP
PHP环形链表实现方法示例
Sep 15 #PHP
PHP实现的链式队列结构示例
Sep 15 #PHP
You might like
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
php实现比较两个字符串日期大小的方法
2015/05/12 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
JQuery CheckBox(复选框)操作方法汇总
2015/04/15 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
Zabbix添加Node.js监控的方法
2016/10/20 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
2019/07/23 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
js实现固定区域内的不重叠随机圆
2019/10/24 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
利用python获取Ping结果示例代码
2017/07/06 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
从0开始的Python学习016异常
2019/04/08 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
世嘉游戏英国官方商店:SEGA Shop UK
2019/09/20 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
师范学院教师自荐书
2014/01/31 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书