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和ACCESS写聊天室(一)
Oct 09 PHP
MySQL授权问题总结
May 06 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
easyui的tabs update正确用法分享
Mar 21 PHP
Yii2针对指定url的生成及图片等的引入方法小结
Jul 18 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
php将服务端的文件读出来显示在web页面实例
Oct 31 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 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初学者头疼问题总结
2006/07/08 PHP
PHP读写文件的方法(生成HTML)
2006/11/27 PHP
PHP网站基础优化方法小结
2008/09/29 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
JS 精确统计网站访问量的实例代码
2013/07/05 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
jquery实现数字输入框
2017/02/22 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
vue下history模式刷新后404错误解决方法
2018/08/18 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python中使用mysql数据库详细介绍
2015/03/27 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
使用python远程操作linux过程解析
2019/12/04 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
英国在线泳装店:Simply Swim
2019/05/05 全球购物
数据管理员的自我评价分享
2013/11/15 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
经济贸易系求职信
2014/08/04 职场文书
基层党员群众路线整改措施及努力方向
2014/10/28 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
学生安全责任协议书
2016/03/22 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书