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中操作MySQL数据库的一些要注意的问题
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
php基本函数汇总
Jul 09 PHP
部署PHP时的4个配置修改说明
Oct 19 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
Dec 14 PHP
PHP简单字符串过滤方法示例
Sep 04 PHP
PHP使用栈解决约瑟夫环问题算法示例
Aug 27 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 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
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
Jquery实现纵向横向菜单
2016/01/24 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
python3 cvs将数据读取为字典的方法
2018/12/22 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
python取均匀不重复的随机数方式
2019/11/27 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
moosejaw旗下的户外商品促销网站:Mountain Steals
2017/02/27 全球购物
海飞丝广告词
2014/03/20 职场文书
护士感人事迹
2014/05/01 职场文书
租房协议书样本
2014/08/20 职场文书
加强作风建设心得体会
2014/10/22 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
归元寺导游词
2015/02/06 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
Python字典和列表性能之间的比较
2021/06/07 Python
Java新手教程之ArrayList的基本使用
2021/06/20 Java/Android
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript