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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
色色整理的PHP面试题集锦
Mar 08 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 PHP
php实现发送微信模板消息的方法
Mar 07 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
php实现水印文字和缩略图的方法示例
Dec 29 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
Jun 16 PHP
Smarty模板语法详解
Jul 20 PHP
php使用pecl方式安装扩展操作示例
Aug 12 PHP
Laravel Reponse响应客户端示例详解
Sep 03 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
php5 图片验证码实现代码
2009/12/11 PHP
php中stream(流)的用法
2014/03/25 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
js分页代码分享
2014/04/28 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
2019/05/30 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
pandas数据拼接的实现示例
2020/04/16 Python
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
如何写出好的Java代码
2014/04/25 面试题
老师推荐信
2013/10/28 职场文书
教师的实习自我鉴定
2013/12/17 职场文书
JS继承最简单的理解方式
2021/03/31 Javascript
python爬取某网站原图作为壁纸
2021/06/02 Python