Laravel思惟導圖之Laravel核心概念

Laravel核心概念

Laravel 的核心概念包括:服務容器、服務提供者、門面(Facades)、契約(Contracts)。php

服務容器是 Laravel 的核心,是一個 IoC 容器,是管理類依賴和運行依賴注入的有力工具。redis

服務提供者則提供服務並綁定服務至服務容器。是全部 Laravel 應用程序引導啓動的中心所在。數據庫

Facades 爲應用程序的服務容器中可用的類提供了一個「靜態」接口。它其實是服務容器中那些底層類的「靜態代理」。編程

Laravel 的 契約(Contracts )是一系列框架用來定義核心服務的接口。數組

無論是契約仍是門面均可以建立出強大的、容易測試的 Laravel 應用程序。緩存

0x00 服務容器

Laravel 的核心就是一個 IoC 容器,該容器提供了整個框架中須要的一系列服務。微信

IoC(Inversion Of Control)控制反轉,是面向對象編程中的一種設計原則,能夠用來減低計算機代碼之間的耦合度。IoC 容器會根據類的依賴需求,自動在註冊、綁定的一堆實例中搜尋符合的依賴需求,並自動注入到構造函數參數中去。經過控制反轉,對象在被建立的時候,由一個調控系統內全部對象的外界實體,將其所依賴的對象的引用傳遞給它。也能夠說,依賴被注入到對象中。這就是依賴注入(Dependency Injection, DI)。依賴注入實質上是指:類的依賴經過構造器或在某些狀況下經過「setter」方法進行「注入」。閉包

Laravel服務容器

如何實現與服務容器的綁定?

幾乎全部服務容器的綁定都是在服務提供者中進行的。在服務提供者內部,能夠經過 $this->app 來訪問容器的實例。app

綁定的方式包括:框架

  • 簡單綁定
  • 綁定一個單例
  • 綁定實例
  • 綁定接口到實現
  • 情境綁定
  • 綁定包括原始數據在內的初始數據
  • 標記

其中,標記可以針對某種類別的全部作綁定。

如何從服務容器解析出對象?

綁定後能夠從服務容器中解析出對象纔可以使用。解析方法包括:

  • 經過 make 方法,接收一個你想要解析的類或者接口
  • 經過數組方式從容器中解析對象
  • 自動注入

自動注入實例

下面的例子中,在控制器的構造函數中對應用程序定義的 Repository 使用類型提示。這樣 Repository 實例會被自動解析並注入到類中:

<?php

namespace App\Http\Controllers;

use App\Users\Repository as UserRepository;

class UserController extends Controller
{
    /**
     * user repository 實例。
     */
    protected $users;

    /**
     * 控制器構造方法。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }

    /**
     * 顯示指定 ID 的用戶信息。
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }
}

0x01 服務提供者

Laravel 中,包括應用程序,以及全部的 Laravel 核心服務,都是經過服務提供者引導啓動的。所謂的「引導啓動」指的是註冊事務,包括註冊服務容器綁定,事件監聽器,中間件,甚至路由。

Laravel服務提供者

全部服務提供者都須要繼承 IlluminateSupportServiceProvider 類。大多數服務提供者都包含 register 和 boot 方法。register 方法中,只能將事務綁定到 服務容器。不該該在 register 方法中嘗試註冊任何事件監聽器,路由或者任何其餘功能。能夠爲服務提供者的 boot 方法設置類型提示。服務容器會自動注入須要的任何依賴。boot 方法將在全部其餘服務提供者均已註冊以後調用。

全部服務提供者都在 config/app.php 配置文件中註冊。能夠選擇推遲服務提供者的註冊,直到真正須要註冊綁定時,這樣能夠提供應用程序的性能。

0x02 門面(Facades)

Laravel Facade

Facades 工做原理

在 Laravel 應用中,一個 facade 就是一個提供訪問容器中對象的類。其中核心的部件就是 Facade 類。無論是 Laravel 自帶的 Facades ,仍是用戶自定義的 Facades ,都繼承自 IlluminateSupportFacadesFacade 類。

Facade 基類使用 __callStatic() 魔術方法在你的 Facades 中延遲調用容器中對應對象的方法,在下面的例子中,調用了 Laravel 的緩存系統。在代碼裏,咱們可能認爲是 Cache 類中的靜態方法 get 被調用了:

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\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 實際上是咱們獲取底層 IlluminateContractsCacheFactory 接口實現的一個代理。咱們經過這個 facade 調用的任何方法,都會被傳遞到 Laravel 緩存服務的底層實例中。

若是咱們看一下 IlluminateSupportFacadesCache 這個類,你會發現類中根本沒有 get 這個靜態方法:

class Cache extends Facade
{
    /**
     * 獲取組件在容器中註冊的名稱。
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'cache'; }
}

其實,Cache facade 是繼承了 Facade 基類,而且定義了 getFacadeAccessor() 方法。這個方法的做用是返回服務容器中對應名字的綁定內容。當用戶調用 Cache facade 中的任何靜態方法時, Laravel 會解析到服務容器中綁定的鍵值爲 cache 實例對象,並調用這個對象對應的方法(在這個例子中就是 get 方法)。

0x03 契約(Contracts)

Laravel Contract

如何使用契約?

Laravel 中的許多類型的類都是經過 服務容器 解析出來的。包括控制器、事件監聽器、中間件、任務隊列,甚至路由的閉包。因此說,要得到一個契約的實現,你只須要解析在類的構造函數中相應的類型約束便可。

例如,看看這個事件監聽器,當事件監聽器被解析時,服務容器會從構造函數裏讀取到類型約束,並注入對應的值。

<?php

namespace App\Listeners;

use App\User;
use App\Events\OrderWasPlaced;
use Illuminate\Contracts\Redis\Database;

class CacheOrderInformation
{
    /**
     * Redis 數據庫實現。
     */
    protected $redis;

    /**
     * 建立事件處理器實例。
     *
     * @param  Database  $redis
     * @return void
     */
    public function __construct(Database $redis)
    {
        $this->redis = $redis;
    }

    /**
     * 處理事件。
     *
     * @param  OrderWasPlaced  $event
     * @return void
     */
    public function handle(OrderWasPlaced $event)
    {
        //
    }
}

下一步

Laravel 做爲「爲 Web 藝術家創造的 PHP 框架」,接下來我將學習其中最重要的內容之一 HTTP 層的相關知識。一樣會整理成思惟導圖的形式以方便記憶與回顧。

這些文章都將首發在微信公衆號:up2048 上。歡迎你們掃描下面的二維碼,咱們一塊兒學習,分享,討論,反思。

思惟導圖導出爲圖片時會致使其變模糊。若須要高清的思惟導圖源文件,請關注微信公衆號:up2048,並回復「精進腦圖」來獲取。

- EOF -

推薦閱讀

相關文章
相關標籤/搜索