laravel門面有什麼用

2022-02-15 13:00:41

在laravel中,門面Facades用於為應用的IoC服務容器的類提供了一個靜態的介面,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');

不過,如果你檢視 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其它相關文章!