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的chr和ord函数实现字符加减乘除运算实现代码
Dec 05 PHP
如何解决CI框架的Disallowed Key Characters错误提示
Jul 05 PHP
PHP创建桌面快捷方式的实例代码
Feb 17 PHP
Linux下手动编译安装PHP扩展的例子分享
Jul 15 PHP
ThinkPHP验证码和分页实例教程
Aug 22 PHP
CI框架验证码CAPTCHA辅助函数用法实例
Nov 05 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 PHP
php浏览历史记录的方法
Mar 10 PHP
浅谈php提交form表单
Jul 01 PHP
thinkPHP5.0框架命名空间详解
Mar 18 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
Aug 10 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 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 Ajax实现页面无刷新发表评论
2007/01/02 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
JavaScript实现表格排序方法
2013/06/14 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
tracking.js实现前端人脸识别功能
2020/04/16 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
python样条插值的实现代码
2018/12/17 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Python3 元组tuple入门基础
2020/02/09 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
几道Java和数据库的面试题
2013/05/30 面试题
护士检查书
2014/01/17 职场文书
班长自荐书范文
2014/02/11 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
公务员年终个人总结
2015/02/12 职场文书
资料员岗位职责范本
2015/04/13 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书