laravel門(mén)面有什么用

laravel中,門(mén)面Facades用于為應(yīng)用的IoC服務(wù)容器的類提供了一個(gè)靜態(tài)的接口,Laravel的門(mén)面作為服務(wù)容器中底層類的靜態(tài)代理,相比于傳統(tǒng)靜態(tài)方法,在維護(hù)時(shí)能夠提供更加易于測(cè)試的語(yǔ)法。

laravel門(mén)面有什么用

本教程操作環(huán)境:windows10系統(tǒng)、Laravel6版,DELL G3電腦。

laravel門(mén)面有什么用

介紹

Facades 為應(yīng)用的 IoC 服務(wù)容器 的類提供了一個(gè)靜態(tài)的接口。Laravel 里面自帶了一些 Facades,如Cache等。Laravel 的門(mén)面作為服務(wù)容器中底層類的“靜態(tài)代理”,相比于傳統(tǒng)靜態(tài)方法,在維護(hù)時(shí)能夠提供更加易于測(cè)試、更加靈活、簡(jiǎn)明優(yōu)雅的語(yǔ)法。

解釋

在 Laravel 應(yīng)用這個(gè)上下文里面,一個(gè) Facade 就是一個(gè)類,使用這個(gè)類可以訪問(wèn)到來(lái)自容器里的一個(gè)對(duì)象,這個(gè)功能就是在 Facade 類里面定義的。Laravel 的 Facades 還有任何你自己定義的 Facades,都會(huì)去繼承 Facade 這個(gè)類。

你的 Facade 類只需要實(shí)施一個(gè)的方法:getFacadeAccessor。要在容器里 resolve 什么出來(lái),都是在這個(gè)方法里去做的。Facade 這個(gè)基類里面使用了__callStatic() 魔術(shù)方法,可以延遲到 resolved 對(duì)象上的,來(lái)自 Facade 的調(diào)用。

所以,當(dāng)你使用 Facade 調(diào)用的時(shí)候,比如像這樣:Cache:get,laravel 會(huì)從 Ioc 服務(wù)容器 里面 resolves 緩存管理類,然后再去調(diào)用這個(gè)類上面的 get 方法。Laravel 的 Facades 可以去定位服務(wù),它是一種使用 Laravel 的 Ioc 服務(wù)容器 的更方便的語(yǔ)法。

優(yōu)點(diǎn)

Facade 有諸多優(yōu)點(diǎn),其提供了簡(jiǎn)單、易記的語(yǔ)法,讓我們無(wú)需記住長(zhǎng)長(zhǎng)的類名即可使用 Laravel 提供的功能特性,此外,由于他們對(duì) php 動(dòng)態(tài)方法的獨(dú)到用法,使得它們很容易測(cè)試。

實(shí)際使用

下面的例子,去調(diào)用了一下 Laravel 的緩存系統(tǒng)。先看一下下面這行代碼,你可能會(huì)覺(jué)得,這是直接去調(diào)用 Cache 這個(gè)類上面的一個(gè)叫 get 的靜態(tài)的方法。

$value?=?Cache::get('key');

不過(guò),如果你查看 IlluminateSupportFacadesCache 這個(gè)類,你會(huì)發(fā)現(xiàn)這里根本就沒(méi)有 get 這個(gè)靜態(tài)方法:

class?Cache?extends?Facade?{ ????/** ?????*?Get?the?registered?name?of?the?component. ?????* ?????*?@return?string ?????*/ ????protected?static?function?getFacadeAccessor()?{?return?'cache';?} }

Cache 這個(gè)類繼承了 Facade 這個(gè)基類,它里面定義了一個(gè)叫 getFacadeAccessor() 的方法。注意,這個(gè)方法的干的事就是去返回一個(gè) Ioc 綁定的名字,這里就是 cache。

當(dāng)用戶在引用任何在 Cache 這個(gè) Facade 上的靜態(tài)方法的時(shí)候,Laravel 就會(huì)從 Ioc 服務(wù)容器 里面去 resolves cache 這個(gè)綁定,并且會(huì)去執(zhí)行在對(duì)象上的這個(gè)所請(qǐng)求的方法(這里就是 get 這個(gè)方法)。

所以,我們?cè)谡{(diào)用 Cache::get 的時(shí)候,它的真正的意思是這樣的:

$value?=?$app->make('cache')->get('key');

導(dǎo)入 Facades

注意,在使用 facade 的時(shí)候,如果控制器里面用到了命名空間,你需要把 Facade 類導(dǎo)入到這個(gè)命名空間里。所有的 Facades 都是在全局命名空間下:

<?php  namespace AppHttpControllers; use Cache; class PhotosController extends Controller {     /**      * Get all of the application photos.      *      * @return Response      */     public function index()     {         $photos = Cache::get(&#39;photos&#39;);         //     } }

創(chuàng)建 Facades

創(chuàng)建 Facade 只需要三個(gè)東西:

  • 一個(gè) IoC 綁定。

  • 一個(gè) Facade 類。

  • 一個(gè) Facade 別名的配置。

在下面我們定義了一個(gè)類:PaymentGatewayPayment 。

namespace?PaymentGateway; class?Payment?{ ????public?function?process() ????{ ????????// ????} }

我們需要能在 Ioc 服務(wù)容器 里面去 resolve 這個(gè)類。所以,先要去添加一個(gè) Service Provider 綁定:

App::bind('payment',?function() { ????return?new?PaymentGatewayPayment; });

去注冊(cè)這個(gè)綁定最好的方法就是去創(chuàng)建一個(gè)新的 Service Provider ,把它命名為 PaymentServiceProvider ,然后把它綁定到 register 方法上。再去配置 laravel 在 config/app.php 這個(gè)配置文件里加載你的 Service Provider。

下一步就是去創(chuàng)建自己的 Facade 類:

use?IlluminateSupportFacadesFacade; class?Payment?extends?Facade?{ ????protected?static?function?getFacadeAccessor()?{ ?????????????return?'payment';? ????} }

最后,如果你愿意,可以去給 Facade 添加一個(gè)別名,放到 config/app.php 配置文件里的 aliases 數(shù)組里。

可以去調(diào)用 Payment 類的一個(gè)實(shí)例上的 process 這個(gè)方法了。像這樣:

Payment::process();

【相關(guān)推薦:laravel視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享