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 相关文章推荐
我的论坛源代码(十)
Oct 09 PHP
php Smarty date_format [格式化时间日期]
Mar 15 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
PHP CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
Jun 06 PHP
php中url函数介绍及使用示例
Feb 13 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
php实现和c#一致的DES加密解密实例
Jul 24 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
详解PHP PDO简单教程
May 28 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 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
PHP中使用正则表达式提取中文实现笔记
2015/01/20 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
JS实现上传图片实时预览功能
2017/05/22 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
python json load json 数据后出现乱序的解决方案
2020/02/27 Python
python 中的paramiko模块简介及安装过程
2020/02/29 Python
Django中的session用法详解
2020/03/09 Python
python logging通过json文件配置的步骤
2020/04/27 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
受外贸欢迎的美国主机:BlueHost
2017/05/16 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
高三英语教学反思
2014/01/13 职场文书
根叔历年演讲稿
2014/05/20 职场文书
运动会的口号
2014/06/09 职场文书
瞿秋白纪念馆观后感
2015/06/10 职场文书
Python包argparse模块常用方法
2021/06/04 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server