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 09 PHP
ThinkPHP模板自定义标签使用方法
Jun 26 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
Feb 03 PHP
简介PHP的Yii框架中缓存的一些高级用法
Mar 29 PHP
php图片上传类 附调用方法
May 15 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
php传值和传引用的区别点总结
Nov 19 PHP
jQuery+PHP实现图片上传并提交功能
Jul 27 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
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
最新优化收藏到网摘代码(digg,diigo)
2007/02/07 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
类似php的js数组的in_array函数自定义方法
2013/12/27 Javascript
JavaScript简单判断复选框是否选中及取出值的方法
2015/08/13 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
javascript数组定义的几种方法
2017/10/06 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
JavaScript 常见的继承方式汇总
2020/09/17 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python 实现随机数详解及实例代码
2017/04/15 Python
Selenium chrome配置代理Python版的方法
2018/11/29 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Python实现数值积分方式
2019/11/20 Python
python IP地址转整数
2020/11/20 Python
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
市场营销毕业求职信
2014/08/07 职场文书
2015年端午节活动方案
2015/05/05 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
小平您好观后感
2015/06/09 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python