建立 Facades

2018-02-24 15:51 更新

為你自己的應(yīng)用程序或擴(kuò)展包建立 facade 是很簡(jiǎn)單的。你只需要 3 個(gè)東西:

一個(gè)服務(wù)容器綁定。
一個(gè) facade 類。
一個(gè) facade 別名配置。

讓我們來看個(gè)例子。這里有一個(gè)定義為 PaymentGateway\Payment 的類。

namespace PaymentGateway;

class Payment {

    public function process()
    {
        //
    }

}

我們需要可以從服務(wù)容器解析出這個(gè)類。所以,讓我們來加上一個(gè)綁定到服務(wù)提供者:

App::bind('payment', function()
{
    return new \PaymentGateway\Payment;
});

注冊(cè)這個(gè)綁定的好方式是建立新的 服務(wù)提供者 命名為 PaymentServiceProvider,并把這個(gè)綁定加到 register 方法。然后你可以配置 Laravel 從 config/app.php 配置文件加載你的服務(wù)提供者。

接下來,我們可以建立我們自己的 facade 類:

use Illuminate\Support\Facades\Facade;

class Payment extends Facade {

    protected static function getFacadeAccessor() { return 'payment'; }

}

最后,如果我們希望,可以在 config/app.php 配置文件為 facade 加個(gè)別名到 aliases 數(shù)組。現(xiàn)在我們可以在 Payment 類的實(shí)例上調(diào)用 process 方法。

Payment::process();

自動(dòng)加載別名的附注

在 aliases 數(shù)組中的類在某些實(shí)例中不能使用,因?yàn)?PHP 將不會(huì)嘗試去自動(dòng)加載未定義的類型提示類。如果 \ServiceWrapper\ApiTimeoutException 命別名為 ApiTimeoutException,即便有異常被拋出,在 \ServiceWrapper 命名空間外面的 catch(ApiTimeoutException $e) 將永遠(yuǎn)捕捉不到異常。類似的問題在有類型提示的別名類一樣會(huì)發(fā)生。唯一的替代方案就是放棄別名并用 use 在每一個(gè)文件的最上面引入你希望類型提示的類。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)