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 相关文章推荐
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
Sep 19 PHP
phpexcel导入excel数据使用方法实例
Dec 24 PHP
PHP中ini_set和ini_get函数的用法小结
Feb 18 PHP
WordPress中制作导航菜单的PHP核心方法讲解
Dec 11 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
php轻松实现文件上传功能
Mar 03 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
Yii使用smsto短信接口的函数demo示例
Jul 13 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
Yii全局函数用法示例
Jan 22 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 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
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
js动态生成form 并用ajax方式提交的实现方法
2016/09/09 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
浅谈Vue使用Elementui修改默认的最快方法
2020/12/05 Vue.js
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
年度考核自我评价
2014/01/25 职场文书
五年级语文教学反思
2014/01/30 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
爱心倡议书范文
2014/05/12 职场文书
奠基仪式策划方案
2014/05/15 职场文书
同意迁入证明模板
2014/10/26 职场文书
2014年前台接待工作总结
2014/12/05 职场文书
环卫个人总结
2015/03/03 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
MySQL视图概念以及相关应用
2022/04/19 MySQL
微信小程序调用python模型
2022/04/21 Python
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android