序
本文主要介绍Laravel中View模块的相关信息,并分享给大家参考和学习。下面就不多说了。我们来看看详细的介绍。
本文是基于Laravel版路由模块代码进行分析编写的。
文件结构
视图模块的文件结构和功能如下图所示:
视觉呈现的大致流程:
1.通过调用view()方法开始视图的呈现;
2.首先,找到视图文件;
(1)依次遍历路径,如果文件名有命名空间(即:3360之前的部分),则使用与命名空间对应的已注册路径数组,否则使用全局路径数组(lighting View file取景器类中的path变量);
(2)结合当前路径、文件名、后缀名(默认顺序为blade.php、php、css)判断文件是否存在;
(3)如果文件不存在,报告异常:对应的视图文件不存在;如果文件存在,根据后缀名称调用对应的引擎进行解析;
3.如果是css后缀,使用文件引擎,核心调用方法是file _ get _ contents
4.如果是php后缀,使用php引擎,核心调用方法是
ob _ start();包括$ _ _路径;ob _ get _ clean();5.如果是blade后缀,使用叶片发动机;
这个引擎会主动缓存。如果缓存文件没有过期,会直接调用缓存文件,否则会重新编译,通过sha1生成缓存文件(位于storage/framework/view目录下)。
刀片引擎编译
Blade引擎编译文件是通过大量的定期匹配替换实现的;
受保护的$编译器=['comments ',//注释部分' Extensions ',//扩展部分' Statements ',//语句块(@ initial指令)' Echos ',//output];受保护的函数parseToken($token) { list($id,$ content)=$ token;if($ id==T _ INLINE _ HTML){ foreach($ this-编译器为$ type){ $ content=$ this-{ ' compile { $ type } ' }($ content);}}}在解析过程中,Blade首先会使用token_get_all函数获取视图文件中被PHP解释器认为是HTML(T_INLINE_HTML)的部分,然后定期依次替换Comments、Extensions、Statements和Echos部分;
评论区
核心代码如下:用空字符串替换注释符号“{{-}}”包装的代码;
preg_replace('/{{ -(。*?)- }}/s ','',$ value);延伸部分
通过扩展方法给BladeCompiler添加自定义回调函数,对模板内容进行自定义文本匹配和替换;
核心代码在照明视图刀片编译器文件中,如下所示:
//自定义文本替换扩展数组受保护$ extensions=[];受保护函数compileExtensions($value){ foreach($ this-extensions as $ compiler){ $ value=call _ user _ func($ compiler,$ value,$ this);}返回$ value}指令替换
这一部分是替换框架附带的指令文本,如@if和通过directive方法注册的指令;
框架提供的说明有以下十个部分:
视图编译器关注编译授权:权限检查指令包括:@can、@ can、@elsecan、@endcan、@ end can关注编译组件:与组件和插槽相关的指令包括:@component、@endcomponent、@slot、@endslot关注编译条件:与判断语句相关的指令包括:@if、@除非、@ else、@elseif、@ endif、@ endunless、@isset、@ endisset、@hassection关注编译包含:嵌入文件@show、@append、@overwrite、@stop、@endsection关注点 CompilesLoops:与循环相关的指令包括:@forelse、@empty、@ endforelse、@ for、@foreach、@break、@continue、@endfor、@endforeach、@while、@endwhile关注点 CompilesRawPhp:与本机Php语句相关的指令包括:@php、@endphp、@unset关注点 CompilesStacks:与堆栈相关的指令包括:@stack、@push、@endpush、@ php
回声输出用于{!}、{{}}、{{{}}定期更换;
{!}输出非转义字符,用于输出本机html标记的值;{{}}输出正常,支持三眼运算符替换;{{{}}}输出转义字符,支持三项式运算符替换;三方运算符替代指:{{ $a?“默认值”}}(或{{$a或“默认值”}})替换为{{ isset($a)?$a :“默认值”}}
参考文章
浅析Laravel模板引擎(叶片)原理
Laravel 5.4文档前端——刀片模板
摘要
以上就是本文的全部内容。希望本文的内容能给你的学习或工作带来一些帮助。有问题可以留言交流。谢谢你的支持。