本文實(shí)例講述了laravel框架實(shí)現(xiàn)為 Blade 模板引擎添加新文件擴(kuò)展名。分享給大家供大家參考,具體如下:
因?yàn)橐恍┰颍覝?zhǔn)備把 Blessing Skin 的框架換成 Laravel 了(之前是自己搭建的一個(gè)框架),但是在模板遷移的時(shí)候遇到了一點(diǎn)問(wèn)題。
之前我是使用的 XiaoLer/blade 這個(gè)從 Laravel 中抽離出來(lái)的 Blade 模板引擎,并且自定義為使用 .tpl文件后綴。你問(wèn)為啥不用默認(rèn)的 .blade.php 而是用這個(gè) Smarty 的模板擴(kuò)展名?能有啥,好看唄 :-D
不過(guò)之前我是直接調(diào)用 FileViewFinder 類的 addExtension 方法來(lái)添加擴(kuò)展名的,但是在 Laravel 里就不能這樣了。你總不能在 Illuminate\View 加幾句話吧?
去 Google 搜索了下,沒(méi)發(fā)現(xiàn)有可以很方便使用的方法(當(dāng)然是搜的鷹文,說(shuō)不定是我姿勢(shì)不對(duì)),就只好自己找了。
首先先從 View Facade 入手,可以看到它是從服務(wù)容器中解析出了 view 這個(gè)綁定。繼續(xù)往下找,打開(kāi) Illuminate\View\ViewServiceProvider,看看 View 的服務(wù)提供者到底是把啥給綁定到 view 上去了:
1
2
3
4
5
6
7
8
9
10
11
|
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 ; }); } |
嗯嗯,我們可以看到這是綁定了個(gè) Illuminate\View\Factory 實(shí)例,于是我們繼續(xù)往下找,看看這個(gè)工廠類都有啥方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 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); } |
哦哦~ 果然我們?cè)诠S類里找到了一個(gè) FileViewFinder::addExtension
的封裝。然而正當(dāng)我欣喜地準(zhǔn)備調(diào)用的時(shí)候,卻發(fā)現(xiàn)這個(gè)方法有個(gè)神秘的 $engine 參數(shù)。
誒?WTF?這尼瑪是啥?( ?_ゝ?)
看了看文檔也沒(méi)看出個(gè)所以然來(lái),就只好從方法的具體代碼里找找蛛絲馬跡了:
1
|
$this ->extensions = array_merge ([ $extension => $engine ], $this ->extensions); |
哦呀?這一行在 $this->extensions
里加上了一個(gè) [$extension => $engine]
的數(shù)組,那么只要我們看看這個(gè)數(shù)組原先的定義,就可以知道這個(gè) $engine 是個(gè)啥子了:
1
2
3
4
5
6
|
/** * The extension to engine bindings. * * @var array */ protected $extensions = [ 'blade.php' => 'blade' , 'php' => 'php' ]; |
啊哈,原來(lái)這個(gè) $engine 指的是解析 $extension 所使用的引擎!這下一切都水落石出了,如果你在傳入 .tpl 的同時(shí)傳入一個(gè) blade 的引擎,就是告訴 Blade,要把以 .tpl 為擴(kuò)展名的文件用 Blade 模板引擎來(lái)解析。
這下一切都簡(jiǎn)單了,我們只需要在 AppServiceProvider (或者其他適當(dāng)?shù)姆?wù)提供者)里通過(guò)調(diào)用 View Facade 就可以非常方便快捷地添加擴(kuò)展名了:
1
|
View::addExtension( 'tpl' , 'blade' ); |
希望本文所述對(duì)大家基于Laravel框架的PHP程序設(shè)計(jì)有所幫助。
原文鏈接:https://www.cnblogs.com/fps2tao/p/7655492.html