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在字符串中查找指定字符串并删除的代码
Oct 02 PHP
基于initPHP的框架介绍
Apr 18 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
php获取系统变量方法小结
May 29 PHP
php实现读取和写入tab分割的文件
Jun 01 PHP
100多行PHP代码实现socks5代理服务器[2]
May 05 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP registerXPathNamespace()函数讲解
Feb 03 PHP
详解PHP队列的实现
Mar 14 PHP
PHP利用百度ai实现文本和图片审核
May 08 PHP
PHP利用DWZ.CN服务生成短网址
Aug 11 PHP
PHP7修改的函数
Mar 09 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判断上传文件类型的解决办法
2015/10/20 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
解析js如何获取css样式
2016/12/11 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
从零开始搭建vue移动端项目到上线的步骤
2018/10/15 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
Ant Design Pro 下实现文件下载的实现代码
2019/12/03 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python字符串替换的2种方法
2014/11/30 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
python中class的定义及使用教程
2019/09/18 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
详解使用HTML5的classList属性操作CSS类
2017/10/13 HTML / CSS
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
幼儿园六一亲子活动方案
2014/08/26 职场文书
学生实习证明范文
2014/09/28 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
Vue2.0搭建脚手架
2022/03/13 Vue.js