资讯专栏INFORMATION COLUMN

为 Blade 模板引擎添加新文件扩展名

Gemini / 1064人阅读

摘要:之前我是使用的这个从中抽离出来的模板引擎,并且自定义为使用文件后缀。这下一切都简单了,我们只需要在或者其他适当的服务提供者里通过调用就可以非常方便快捷地添加扩展名了谨以此文记录,愿能帮到后来人

原文地址:https://prinzeugen.net/add-ex...

因为一些原因,我准备把 Blessing Skin 的框架换成 Laravel 了(之前是自己搭建的一个框架),但是在模板迁移的时候遇到了一点问题。

之前我是使用的 XiaoLer/blade 这个从 Laravel 中抽离出来的 Blade 模板引擎,并且自定义为使用 .tpl 文件后缀。你问为啥不用默认的 .blade.php 而是用这个 Smarty 的模板扩展名?能有啥,好看呗 :-D

不过之前我是直接调用 FileViewFinder 类的 addExtension 方法来添加扩展名的,但是在 Laravel 里就不能这样了。你总不能在 IlluminateView 加几句话吧?

去 Google 搜索了下,没发现有可以很方便使用的方法(当然是搜的鹰文,说不定是我姿势不对),就只好自己找了。

首先先从 View Facade 入手,可以看到它是从服务容器中解析出了 view 这个绑定。继续往下找,打开 IlluminateViewViewServiceProvider,看看 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;
    });
}

嗯嗯,我们可以看到这是绑定了个 IlluminateViewFactory 实例,于是我们继续往下找,看看这个工厂类都有啥方法:

/**
 * 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");

谨以此文记录,愿能帮到后来人 (*´∀`)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30447.html

相关文章

  • Laravel 模板引擎Blade)原理简析

    摘要:上次提到过,模板引擎一般是要做三件事情变量值的输出条件判断和循环引入或继承其他文件现在就来看看的模板引擎是如何来处理这三件事情的。引擎接下来就是本文的重点是如何编译的。如果有兴趣的话,也可以实现一个自己的模板解析引擎。 上次提到过,模板引擎一般是要做三件事情: 变量值的输出(echo) 条件判断和循环(if ... else、for、foreach、while) 引入或继承其他文件 ...

    vvpvvp 评论0 收藏0
  • laravel框架应用和composer扩展包开发

    摘要:官方地址是目前最流行的框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,框架思想前卫,跟随时代潮流,提倡优雅代码,自称为工匠,其中的模板引擎容器以及扩展包为业务的开发提供了极大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,lara...

    shevy 评论0 收藏0
  • Laravel 5.4 正式发布

    摘要:它的目的是提供正确的方式进行页面交互测试,所以可以使用去点击按钮或者链接填写表单甚至拖放。此外,提到测试运行比更快。此次因底层架构改变较大而重命名。这个功能受到的启发,能够将元素简化为可重用区域。 showImg(https://segmentfault.com/img/remote/1460000008212617); 转自 Laravel 社区:https://laravel-ch...

    Vultr 评论0 收藏0
  • 在Laravel5.* 中使用 AdminLTE

    摘要:在中使用是一个很棒的单纯的由和构建的后台模板,在这片文章中,我将讲述如何将和优雅的整合在一起,而且我们可以通过来及时的更新和管理。 showImg(https://segmentfault.com/img/bVqBce); 在Laravel5.* 中使用 AdminLTE AdminLTE是一个很棒的单纯的由 HTML 和 CSS 构建的后台模板,在这片文章中,我将讲述如何将 Admi...

    Y3G 评论0 收藏0
  • 现在写 PHP,你应该知道这些

    摘要:首先你应该是在用以上的版本,如果版本在这之下,是时候该升级了。按照其官网的说法,这个组织的目的并不是告诉你你应该怎么做,只是一些主流的框架之间相互协商和约定。和没有出现在以上的列表中,是因为还没有投票通过。不要被这些话所困扰。 首先你应该是在用 PHP 5.3 以上的版本,如果 PHP 版本在这之下,是时候该升级了。我建议如果有条件,最好使用最新的版本。 你应该看过 PHP The R...

    supernavy 评论0 收藏0

发表评论

0条评论

Gemini

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<