爲 Blade 模板引擎添加新文件擴展名

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

由於一些緣由,我準備把 Blessing Skin 的框架換成 Laravel 了(以前是本身搭建的一個框架),可是在模板遷移的時候遇到了一點問題。laravel

以前我是使用的 XiaoLer/blade 這個從 Laravel 中抽離出來的 Blade 模板引擎,而且自定義爲使用 .tpl 文件後綴。你問爲啥不用默認的 .blade.php 而是用這個 Smarty 的模板擴展名?能有啥,好看唄 :-Dgit

不過以前我是直接調用 FileViewFinder 類的 addExtension 方法來添加擴展名的,可是在 Laravel 裏就不能這樣了。你總不能在 Illuminate\View 加幾句話吧?github

去 Google 搜索了下,沒發現有能夠很方便使用的方法(固然是搜的鷹文,說不定是我姿式不對),就只好本身找了。數組

首先先從 View Facade 入手,能夠看到它是從服務容器中解析出了 view 這個綁定。繼續往下找,打開 Illuminate\View\ViewServiceProvider,看看 View 的服務提供者究竟是把啥給綁定到 view 上去了:app

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 參數。less

誒?WTF?這尼瑪是啥?( ・_ゝ・)ide

看了看文檔也沒看出個因此然來,就只好從方法的具體代碼裏找找蛛絲馬跡了:this

$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');

謹以此文記錄,願能幫到後來人 (*´∀`)

相關文章
相關標籤/搜索