原文地址: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');
謹以此文記錄,願能幫到後來人 (*´∀`)