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程式設計有所幫助。