【Laravel5.2翻譯】Contacts


前陣子看了點Laravel源碼,越看越亂,網上大部分中文文檔都是直譯,比較生澀難懂,還是決定看英文文檔順便就我的理解做下翻譯整理記錄下來

思維導圖

簡介

Larvel的Contracts是一系列接口,它們定義了由框架提供的核心服務。例如,Illuminate\Contracts\Queue\Queue定義了隊列工作需要的方法,Illuminate\Contracts\Mail\Mailer定義了發送郵件的方法。
每個contract都有框架提供的對應實現。例如,Laravel提供了不同驅動下的queue實現,還有一個SwiftMailer的mailer實現

所有的Laravel contracts都存放在他們自己的GitHub倉庫中。這提供了一個快速導航,可以讓你定位到可用的contracts,還有獨立的,解耦的package讓package開發者可以用來開發。

Contracts和門面

Laravel的門面提供了一個利用Laravel服務的簡潔方法,不需要類型提示也不需要從服務容器中解析contracts。然而,用contracts可以為一個類定義明確的依賴。對于大多數應用,門面很好用。當然,如果你需要contracts提供的極度松耦合,那就讀下去!

為什么要用Contracts

你可能有很多關于contracts的問題。為什么要用接口?用接口會不會更復雜?讓我們從下面幾點來挖掘用接口的理由:松耦合和簡潔。

松耦合

首先,讓我們回顧一段緩存首先緊耦合的代碼:

<?php

namespace App\Orders;

class Repository
{
    /**
     * The cache instance.
     */
    protected $cache;

    /**
     * Create a new repository instance.
     *
     * @param  \SomePackage\Cache\Memcached  $cache
     * @return void
     */
    public function __construct(\SomePackage\Cache\Memcached $cache)
    {
        $this->cache = $cache;
    }

    /**
     * Retrieve an Order by ID.
     *
     * @param  int  $id
     * @return Order
     */
    public function find($id)
    {
        if ($this->cache->has($id))    {
            //
        }
    }
}

在這個類中,代碼對指定緩存實現緊耦合。這是一個緊耦合因為我們依賴于vendor包內的固定的緩存。如果那個package內的API發生的變化,我們的代碼也要變。
同樣的,如果我們想要把底層緩存技術(Mecached)替換成另一個技術(Redis),我們必須修改倉庫。我們的倉庫無法得知誰提供了數據還有他們如何提供。

取而代之,我們可以改進我們的代碼,讓它們依賴于一個簡單的,vendor無關的接口:

<?php

namespace App\Orders;

use Illuminate\Contracts\Cache\Repository as Cache;

class Repository
{
    /**
     * The cache instance.
     */
    protected $cache;

    /**
     * Create a new repository instance.
     *
     * @param  Cache  $cache
     * @return void
     */
    public function __construct(Cache $cache)
    {
        $this->cache = $cache;
    }
}

現在代碼不耦合于任何特定的vendor或者Laravel。因為contracts不包含任何實現和依賴,可以輕松為contract編寫可變實現,你可以替換緩存實現而不用修改任何它服務的代碼

簡潔

當所有的Laravel服務都由簡單接口定義,明確給定服務提供的功能就會變得簡單。contracts就像框架特征的一個簡潔文檔
另外,當依賴簡單的接口,你的代碼理解和維護起來就更簡單。不用再從龐大,復雜的類中查看哪個方法可以用,你只要參考簡單干凈的接口就可以了。

如何使用Contracts

你如何獲得一個contract實現?這很簡單。
很多類型的類都是通過服務器容器解析的,包括控制器、事件監聽、中間件、隊列工作甚至路由閉包。所以,你只需要在要解析的類的構造函數中類型提示接就可以獲得contract的實現了。

例如,看看下面這個事件監聽:

<?php

namespace App\Listeners;

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

class CacheUserInformation
{
    /**
     * The Redis database implementation.
     */
    protected $redis;

    /**
     * Create a new event handler instance.
     *
     * @param  Database  $redis
     * @return void
     */
    public function __construct(Database $redis)
    {
        $this->redis = $redis;
    }

    /**
     * Handle the event.
     *
     * @param  NewUserRegistered  $event
     * @return void
     */
    public function handle(NewUserRegistered $event)
    {
        //
    }
}

當你的事件監聽被解析,服務容器會讀取構造函數類型提示,然后注入適當的值。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,810評論 18 139
  • 先說幾句廢話,調和氣氛。事情的起由來自客戶需求頻繁變更,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,073評論 0 12
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,619評論 0 121
  • 過去做事情急,什么東西拿起來就用,不喜歡進行系統性的學習,造成在使用過程中的錯誤和低效,現在感覺自己耐心多了,用之...
    馬文Marvin閱讀 2,009評論 0 10
  • 今天開始準備寫作業,云吞:一斤蝦,4兩肉,一斤蝦一湯匙芝麻粉,一湯匙大地魚粉,白芝麻炸了,涼好裝瓶里,需要時打磨成...
    慧蘭閱讀 164評論 0 0