Facades

簡介

Facades 為應用程式的服務容器中可用的類別提供一個「靜態」介面。Laravel 附帶許多 facades,甚至你可能在不知情的狀況下已經使用他們!Laravel 「facades」作為在服務容器內基底類別的「靜態代理」,提供了一個簡潔、易表達的語法優點,同時維持比傳統的靜態方法更高的可測試性和彈性。

使用 Facades

在 Laravel 應用程式環境(Context)中,facade 是個提供從容器存取物件的類別。Facade 類別是讓這個機制可以運作的原因。Laravel 的 facades,以及任何你建立的客製化 facades,會繼承基底 Illuminate\Support\Facades\Facade 類別。

facade 類別只需要去實作一個方法:getFacadeAccessorgetFacadeAccessor 方法的工作定義是從容器中解析出什麼。Facade 基底類別利用 __callStatic() 魔術方法從你的 facade 延遲呼叫來解析物件。

在下面的範例,呼叫了 Laravel 的快取系統。看了一下這個程式碼,或許有人認為靜態方法 get 是被 Cache 類別呼叫的:

<?php

namespace App\Http\Controllers;

use Cache;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * 顯示給定使用者的個人資料。
     *
     * @param  int  $id
     * @return Response
     */
    public function showProfile($id)
    {
        $user = Cache::get('user:'.$id);

        return view('profile', ['user' => $user]);
    }
}

注意在檔案的上方,我們「導入」Cache facade。這個 facade 做為存取底層實作 Illuminate\Contracts\Cache\Factory 介面的代理。我們使用 facade 的任何呼叫將會傳送給 Laravel 快取服務的底層實例。

如果我們查看 Illuminate\Support\Facades\Cache 類別,你會發現沒有靜態方法 get

class Cache extends Facade
{
    /**
     * 取得元件的註冊名稱。
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'cache'; }
}

相反的,Cache facade 繼承了基底 Facade 類別以及定義了 getFacadeAccessor() 方法。記住,這個方法的工作是回傳服務容器綁定的名稱。當使用者在 Cache facade 上參考任何的靜態方法,Laravel 會從服務容器解析被綁定的 cache 以及針對物件執行請求的方法(在這個範例中是 get)。

Facade 類別參考

在下方你可以找到每個 facade 及其底層的類別。這個工具對於透過給定 facade 的來源快速尋找 API 文件相當有用。可應用的服務容器綁定關鍵字也包含在裡面。

Facade Class Service Container Binding
App Illuminate\Foundation\Application app
Artisan Illuminate\Contracts\Console\Kernel artisan
Auth Illuminate\Auth\AuthManager auth
Auth (Instance) Illuminate\Auth\Guard  
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher  
Cache Illuminate\Cache\Repository cache
Config Illuminate\Config\Repository config
Cookie Illuminate\Cookie\CookieJar cookie
Crypt Illuminate\Encryption\Encrypter encrypter
DB Illuminate\Database\DatabaseManager db
DB (Instance) Illuminate\Database\Connection  
Event Illuminate\Events\Dispatcher events
File Illuminate\Filesystem\Filesystem files
Gate Illuminate\Contracts\Auth\Access\Gate  
Hash Illuminate\Contracts\Hashing\Hasher hash
Input Illuminate\Http\Request request
Lang Illuminate\Translation\Translator translator
Log Illuminate\Log\Writer log
Mail Illuminate\Mail\Mailer mailer
Password Illuminate\Auth\Passwords\PasswordBroker auth.password
Queue Illuminate\Queue\QueueManager queue
Queue (Instance) Illuminate\Queue\QueueInterface  
Queue (Base Class) Illuminate\Queue\Queue  
Redirect Illuminate\Routing\Redirector redirect
Redis Illuminate\Redis\Database redis
Request Illuminate\Http\Request request
Response Illuminate\Contracts\Routing\ResponseFactory  
Route Illuminate\Routing\Router router
Schema Illuminate\Database\Schema\Blueprint  
Session Illuminate\Session\SessionManager session
Session (Instance) Illuminate\Session\Store  
Storage Illuminate\Contracts\Filesystem\Factory filesystem
URL Illuminate\Routing\UrlGenerator url
Validator Illuminate\Validation\Factory validator
Validator (Instance) Illuminate\Validation\Validator  
View Illuminate\View\Factory view
View (Instance) Illuminate\View\View