在laravel中,門面Facades用於為應用的IoC服務容器的類提供了一個靜態的介面,Laravel的門面作為服務容器中底層類的靜態代理,相比於傳統靜態方法,在維護時能夠提供更加易於測試的語法。
本教學操作環境:windows10系統、Laravel6版,DELL G3電腦。
介紹
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');
不過,如果你檢視 Illuminate\Support\Facades\Cache 這個類,你會發現這裡根本就沒有 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 App\Http\Controllers; use Cache; class PhotosController extends Controller { /** * Get all of the application photos. * * @return Response */ public function index() { $photos = Cache::get('photos'); // } }
建立 Facades
建立 Facade 只需要三個東西:
一個 IoC 繫結。
一個 Facade 類。
一個 Facade 別名的設定。
在下面我們定義了一個類:PaymentGateway\Payment 。
namespace PaymentGateway; class Payment { public function process() { // } }
我們需要能在 Ioc 服務容器 裡面去 resolve 這個類。所以,先要去新增一個 Service Provider 繫結:
App::bind('payment', function() { return new \PaymentGateway\Payment; });
去註冊這個繫結最好的方法就是去建立一個新的 Service Provider ,把它命名為 PaymentServiceProvider ,然後把它繫結到 register 方法上。再去設定 laravel 在 config/app.php 這個組態檔裡載入你的 Service Provider。
下一步就是去建立自己的 Facade 類:
use Illuminate\Support\Facades\Facade; class Payment extends Facade { protected static function getFacadeAccessor() { return 'payment'; } }
最後,如果你願意,可以去給 Facade 新增一個別名,放到 config/app.php 組態檔裡的 aliases 陣列裡。
可以去呼叫 Payment 類的一個範例上的 process 這個方法了。像這樣:
Payment::process();
【相關推薦:】
以上就是laravel門面有什麼用的詳細內容,更多請關注TW511.COM其它相關文章!