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 相关文章推荐
Zend framework处理一个http请求的流程分析
Feb 08 PHP
php空间不支持socket但支持curl时recaptcha的用法
Nov 07 PHP
PHP中return 和 exit 、break和contiue 区别与用法
Apr 09 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 PHP
php去除html标记的原生函数详解
Jan 27 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
Dec 28 PHP
PHP实现登陆表单提交CSRF及验证码
Jan 24 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
php面向对象程序设计中self与static的区别分析
May 21 PHP
PHP中有关长整数的一些操作教程
Sep 11 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
通过html表格发电子邮件
2006/10/09 PHP
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
php查看网页源代码的方法
2015/03/13 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
python jenkins 打包构建代码的示例代码
2019/11/29 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
关于tensorflow softmax函数用法解析
2020/06/30 Python
python logging模块的使用
2020/09/07 Python
Python类型转换的魔术方法详解
2020/12/23 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
大学专科自荐信
2014/06/17 职场文书
个人专业技术总结
2015/03/05 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
Redis实现一个账号只能登录一个设备
2022/04/19 Redis