laravel門面有什么用

laravel中,門面Facades用于為應用的IoC服務容器的類提供了一個靜態的接口,Laravel的門面作為服務容器中底層類的靜態代理,相比于傳統靜態方法,在維護時能夠提供更加易于測試的語法。

laravel門面有什么用

本教程操作環境:windows10系統、Laravel6版,DELL G3電腦。

laravel門面有什么用

介紹

Facades 為應用的 IoC 服務容器 的類提供了一個靜態的接口。Laravel 里面自帶了一些 Facades,如Cache等。Laravel 的門面作為服務容器中底層類的“靜態代理”,相比于傳統靜態方法,在維護時能夠提供更加易于測試、更加靈活、簡明優雅的語法。

解釋

在 Laravel 應用這個上下文里面,一個 Facade 就是一個類,使用這個類可以訪問到來自容器里的一個對象,這個功能就是在 Facade 類里面定義的。Laravel 的 Facades 還有任何你自己定義的 Facades,都會去繼承 Facade 這個類。

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

所以,當你使用 Facade 調用的時候,比如像這樣:Cache:get,laravel 會從 Ioc 服務容器 里面 resolves 緩存管理類,然后再去調用這個類上面的 get 方法。Laravel 的 Facades 可以去定位服務,它是一種使用 Laravel 的 Ioc 服務容器 的更方便的語法。

優點

Facade 有諸多優點,其提供了簡單、易記的語法,讓我們無需記住長長的類名即可使用 Laravel 提供的功能特性,此外,由于他們對 php 動態方法的獨到用法,使得它們很容易測試。

實際使用

下面的例子,去調用了一下 Laravel 的緩存系統。先看一下下面這行代碼,你可能會覺得,這是直接去調用 Cache 這個類上面的一個叫 get 的靜態的方法。

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

不過,如果你查看 IlluminateSupportFacadesCache 這個類,你會發現這里根本就沒有 get 這個靜態方法:

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

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

當用戶在引用任何在 Cache 這個 Facade 上的靜態方法的時候,Laravel 就會從 Ioc 服務容器 里面去 resolves cache 這個綁定,并且會去執行在對象上的這個所請求的方法(這里就是 get 這個方法)。

所以,我們在調用 Cache::get 的時候,它的真正的意思是這樣的:

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

導入 Facades

注意,在使用 facade 的時候,如果控制器里面用到了命名空間,你需要把 Facade 類導入到這個命名空間里。所有的 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;);         //     } }

創建 Facades

創建 Facade 只需要三個東西:

  • 一個 IoC 綁定。

  • 一個 Facade 類。

  • 一個 Facade 別名的配置。

在下面我們定義了一個類:PaymentGatewayPayment 。

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

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

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

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

下一步就是去創建自己的 Facade 類:

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

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

可以去調用 Payment 類的一個實例上的 process 這個方法了。像這樣:

Payment::process();

【相關推薦:laravel視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享