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
PHP中for循环语句的几种变型
Nov 26 PHP
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
Dec 31 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
Jul 01 PHP
php生成gif动画的方法
Nov 05 PHP
Yii快速入门经典教程
Dec 28 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
Dec 04 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 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中文乱码
2009/11/26 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
纯php生成随机密码
2015/10/30 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
jquery的键盘事件修改代码
2011/02/24 Javascript
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
python实现计算资源图标crc值的方法
2014/10/05 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
新加坡最早生产电动滑板车的制造商之一:FunsToTheFore
2020/09/08 全球购物
大学新生军训个人的自我评价
2013/10/03 职场文书
大学生物业管理求职信
2013/10/24 职场文书
个人素质的自我评价分享
2013/12/16 职场文书
先进工作者获奖感言
2014/02/08 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
工作证明英文模板
2014/10/21 职场文书
2014年平安夜寄语
2014/12/08 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
详解pytorch创建tensor函数
2022/03/22 Python