laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例


Posted in PHP onJanuary 25, 2020

本文实例讲述了laravel框架实现为 Blade 模板引擎添加新文件扩展名。分享给大家供大家参考,具体如下:

因为一些原因,我准备把 Blessing Skin 的框架换成 Laravel 了(之前是自己搭建的一个框架),但是在模板迁移的时候遇到了一点问题。

之前我是使用的 XiaoLer/blade 这个从 Laravel 中抽离出来的 Blade 模板引擎,并且自定义为使用 .tpl文件后缀。你问为啥不用默认的 .blade.php 而是用这个 Smarty 的模板扩展名?能有啥,好看呗 :-D

不过之前我是直接调用 FileViewFinder 类的 addExtension 方法来添加扩展名的,但是在 Laravel 里就不能这样了。你总不能在 Illuminate\View 加几句话吧?

去 Google 搜索了下,没发现有可以很方便使用的方法(当然是搜的鹰文,说不定是我姿势不对),就只好自己找了。

首先先从 View Facade 入手,可以看到它是从服务容器中解析出了 view 这个绑定。继续往下找,打开 Illuminate\View\ViewServiceProvider,看看 View 的服务提供者到底是把啥给绑定到 view 上去了:

public function registerFactory()
{
  $this->app->singleton('view', function ($app) {
    $resolver = $app['view.engine.resolver'];
    $finder = $app['view.finder'];
    $env = new Factory($resolver, $finder, $app['events']);
    $env->setContainer($app);
    $env->share('app', $app);
    return $env;
  });
}

嗯嗯,我们可以看到这是绑定了个 Illuminate\View\Factory 实例,于是我们继续往下找,看看这个工厂类都有啥方法:

/**
 * Register a valid view extension and its engine.
 *
 * @param string  $extension
 * @param string  $engine
 * @param \Closure $resolver
 * @return void
 */
public function addExtension($extension, $engine, $resolver = null)
{
  $this->finder->addExtension($extension);
  if (isset($resolver)) {
    $this->engines->register($engine, $resolver);
  }
  unset($this->extensions[$extension]);
  $this->extensions = array_merge([$extension => $engine], $this->extensions);
}

哦哦~ 果然我们在工厂类里找到了一个 FileViewFinder::addExtension 的封装。然而正当我欣喜地准备调用的时候,却发现这个方法有个神秘的 $engine 参数。

诶?WTF?这尼玛是啥?( ・_?・)

看了看文档也没看出个所以然来,就只好从方法的具体代码里找找蛛丝马迹了:

$this->extensions = array_merge([$extension => $engine], $this->extensions);

哦呀?这一行在 $this->extensions 里加上了一个 [$extension => $engine] 的数组,那么只要我们看看这个数组原先的定义,就可以知道这个 $engine 是个啥子了:

/**
 * The extension to engine bindings.
 *
 * @var array
 */
protected $extensions = ['blade.php' => 'blade', 'php' => 'php'];

啊哈,原来这个 $engine 指的是解析 $extension 所使用的引擎!这下一切都水落石出了,如果你在传入 .tpl 的同时传入一个 blade 的引擎,就是告诉 Blade,要把以 .tpl 为扩展名的文件用 Blade 模板引擎来解析。

这下一切都简单了,我们只需要在 AppServiceProvider (或者其他适当的服务提供者)里通过调用 View Facade 就可以非常方便快捷地添加扩展名了:

View::addExtension('tpl', 'blade');

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
PHP安全性漫谈
Jun 28 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
PHP生成唯一订单号
Jul 05 PHP
php生成数字字母的验证码图片
Jul 14 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
浅析PHP中的i++与++i的区别及效率
Jun 15 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
May 19 PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 #PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 #PHP
laravel框架中间件简单使用方法示例
Jan 25 #PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 #PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 #PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 #PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 #PHP
You might like
PHP的FTP学习(四)
2006/10/09 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
php中转义mysql语句的实现代码
2011/06/24 PHP
PHP文章按日期(月日)SQL归档语句
2012/11/29 PHP
javascript 三种方法实现获得和设置以及移除元素属性
2013/03/20 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
js运动事件函数详解
2016/10/21 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
jQuery validate 验证radio实例
2017/03/01 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
整理HTML5移动端开发的常用触摸事件
2016/04/15 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
《春晓》教学反思
2014/04/20 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
家长高考寄语
2015/02/27 职场文书
机关保密工作承诺书
2015/05/04 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers