laravel 基礎教程 —— 假面

假面(Facades)

簡介

假面提供了一種類似‘靜態’接口的方式來從服務容器中提取可用類的方法。laravel 自身附帶了許多的假面,你可能在還不知道它的時候就已經使用過它了。laravel 的假面服務就好像是一個從服務容器中取出底層類的代理(你帶上我的面具,你就可以使用我的方法了),它提供了一種簡潔語法的同時保持了比傳統靜態方法更高的可測試性和靈活性。

使用假面

在 laravel 中,假面是一種能夠訪問服務容器中對象的類。而使這項工作能夠運行的就是 Facade 類。laravel 中的假面或者任何你所自定義的假面都必須要繼承 Illuminate\Support\Facades\Facade 類。

一個假面類僅僅只需要去實現一個單一的 getFacadeAccessor 方法就可以了。而 getFacadeAccessor 方法的任務就是定義需要從服務容器中返回什么對象。Facade 基類使用了 __callStatic() 魔術方法讓假面來延遲訪問容器中相應的對象。

在下面的例子中,使用了 laravel 緩存系統的一個方法調用。如果只是匆匆的看一眼,你很可能會覺得這是在調用緩存類的靜態方法 get:

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller
{
  /**
   * Show the profile for the given user.
   *
   * @param int $id
   * @return Response
   */
   public function showProfile($id)
   {
     $user = Cache::get('user' . $id);

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

你應該注意到我們在文件的頂部引入的是 Cache 假面。這個假面服務相當于訪問 Illuminate\Contracts\Cache\Factory 接口底層實現的代理。所有使用假面調用的方法都會在 laravel 緩存服務的底層實現進行傳遞調用。

如果我們看一下 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() 方法。這個方法的主要任務就是從服務容器中返回所綁定名稱的對象。當用戶調用任何 Cache 假面的靜態方法時,laravel 從服務容器中返回綁定了 cache 為名稱的對象,并且使用這個對象調用所請求的方法。

假面類參考

在下面的表格中你會找到所有的假面及其所對應的底層實現類。這是一個可以迅速挖掘給定假面 API 的有用工具。在服務容器中所給的綁定鍵也包括在其中。

Facade Class Service Container Binding
App Illuminate\Foundation\Application app
Artisan Illuminate\Contracts\Console\Kernel artisan
Auth Illuminate\Auth\AuthManager auth
Blade Illuminate\View\Compilers\BladeCompiler blade.compiler
Bus Illuminate\Contracts\Bus\Dispatcher
Cache Illuminathe\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
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\Contracts\Queue\Queue queue
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 先說幾句廢話,調和氣氛。事情的起由來自客戶需求頻繁變更,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,076評論 0 12
  • 介紹 Facades 為應用的 IoC 服務容器 的類提供了一個靜態的接口。Laravel 里面自帶了一些 Fac...
    伊Summer閱讀 11,083評論 0 11
  • 過去做事情急,什么東西拿起來就用,不喜歡進行系統性的學習,造成在使用過程中的錯誤和低效,現在感覺自己耐心多了,用之...
    馬文Marvin閱讀 2,013評論 0 10
  • Facade 布局是在面向對象編程中經常使用的一種軟件設計布局方式。Facade 實際上是一種包括復雜函數庫的類,...
    OneAPM閱讀 1,493評論 0 15
  • Laravel 的核心概念包括:服務容器、服務提供者、門面(Facades)、契約(Contracts)。 服務容...
    胖福哥閱讀 2,804評論 0 24