laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

(0)

相关推荐

  • Laravel 5.1 框架Blade模板引擎用法实例分析

    本文实例讲述了Laravel 5.1 框架Blade模板引擎用法.分享给大家供大家参考,具体如下: 为什么要使用blade 它是干什么用的? blade模板引擎使我们写HTML页面的地方,使用它是因为它能给我们提供很多的遍历,减少代码的重复率 提高开发效率.我们写blade的路径是 resources/view 下,它的文件名后缀是blade.php. 1 继承 继承是相当爽的,它可以从主模板继承所有代码,以免大量的代码重复.这样说比较片面,具体看眼代码吧. 1.1 模板继承拓展 代码片段 首先

  • Laravel实现通过blade模板引擎渲染视图

    laravel提供了blade模板引擎用于视图的渲染,在blade中可以直接使用PHP代码,并且blade最终也会被编译为php缓存起来,只有在blade文件被修改后才会重新编译,这一点可以节省开销提高应用性能.blade文件.blade.php作为视图文件存放于laravel的resource/views目录下. 1.定义模板 blade定义模板页面同创建html页面一样,只不过在适当的位置通过@section或@yield来占位,当其它页面引用模板页时将内容填充到占位的位置即可 <html>

  • Laravel 5框架学习之Blade 简介

    在多个页面中我们可能包含相同的内容,像是文件头,链接的css或者js等.我们可以利用布局文件完成这个功能. 让我们新建一个布局文件,例如 views/layout.blade.php <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="s

  • 在Laravel 的 Blade 模版中实现定义变量

    有时候我们需要在 Laravel 的 Blade 模版中定义一些变量,而 Blade 却没有提供这样的方法,所以我们这里为大家分享两种可以实现在 Blade 模版中定义变量的方法. 方法一 由于 Blade 模版中允许使用原生 PHP 代码,所以我们可以使用 PHP 语句来定义变量: <?php $var = 'test'; ?> {{ $var }} 方法二 除了上面的方法,我们还可以使用 Blade 的注释语法来定义/设置变量.由于在 Blade 中 {{-- 这里是注释 --}} 会被解

  • Laravel框架中Blade模板的用法示例

    简介 Blade它不像其他流行的 PHP 模板引擎那样限制你在视图中使用原生的 PHP 代码,事实上它就是把 Blade 视图编译成原生的 PHP 代码并缓存起来.缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担.Blade 视图文件使用 .blade.php 后缀,一般情况下都被存储在 resources/views 目录. 1. 继承.片段.占位.组件.插槽 1.1 继承 1.1.1 定义父模板 Laravel/resources/views/ba

  • Laravel模板引擎Blade中section的一些标签的区别介绍

    Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚.比如,使用中可能会遇到这样的问题: 1.@yield 和 @section 都可以预定义可替代的区块,这两者有什么区别呢? 2.@section 可以用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢? 本文试对这些问题做一个比较浅显但是直观的介绍. @yield 与 @section 首先,@y

  • 解决Laravel blade模板转义html标签的问题

    解决Laravel blade模板转义html标签的问题: 后台textarea提交到表里面的数据展现到前端页面时(在后台已使用nl2br()函数进行转换),直接显示如下: 很尴尬!!! 解决方法如下: {!! $res->content !!} 中间部分是需要输出到页面的内容 使用{{}}会自动使用php中的htmlspecialchars方法来转义成实体,然后输出 上面那种方法可以不转义输出 新手,马克一下... 以上这篇解决Laravel blade模板转义html标签的问题就是小编分享给

  • Laravel框架之blade模板新手入门教程及小技巧

    简介 Blade 是 Laravel 所提供的一个简单且强大的模板引擎.相较于其它知名的 PHP 模板引擎,Blade 并不会限制你必须得在视图中使用 PHP 代码.所有 Blade 视图都会被编译缓存成普通的 PHP 代码,一直到它们被更改为止.这代表 Blade 基本不会对你的应用程序生成负担. Blade 视图文件使用 .blade.php 做为扩展名,通常保存于 resources/views 文件夹内. 为什么要使用blade模板 容易理解,思路清晰 方便,直接可以在框架里使用,可以直

  • Laravel中的Blade模板引擎示例详解

    前言 本文主要给大家介绍了关于Laravel中Blade模板引擎的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧. Blade 模板引擎 Blade 是 laravel 提供的一个简单强大的模板引擎,它是把 Blade 视图编译成原生的 PHP 代码并缓存起来.缓存会在 Blade 视图改变时而改变,这意味着 Blade 并没有给你的应用添加编译的负担.Blade 视图文件使用 .blade.php 后缀,一般都存储在 resources/views 目录下. 模板继承 先

  • Laravel 实现在Blade模版中使用全局变量代替路径的例子

    在使用tp框架时,我们可以用常量来代替文件路径,如: <img class="style" src="__TMPL__/uploads/ad/{$item.config.shop_image}"> 我们只需要在配置文件中设置即可, TMPL_PARSE_STRING' => array( '__TMPL__' => __ROOT__.'/tpl', '__UPLOAD__' => __ROOT__."/Data/upload&

随机推荐