【Laravel5.2翻譯】Contacts


前陣子看了點(diǎn)Laravel源碼篓像,越看越亂动遭,網(wǎng)上大部分中文文檔都是直譯善茎,比較生澀難懂明垢,還是決定看英文文檔順便就我的理解做下翻譯整理記錄下來

思維導(dǎo)圖

簡介

Larvel的Contracts是一系列接口蚣常,它們定義了由框架提供的核心服務(wù)。例如痊银,Illuminate\Contracts\Queue\Queue定義了隊列工作需要的方法抵蚊,Illuminate\Contracts\Mail\Mailer定義了發(fā)送郵件的方法。
每個contract都有框架提供的對應(yīng)實(shí)現(xiàn)溯革。例如贞绳,Laravel提供了不同驅(qū)動下的queue實(shí)現(xiàn),還有一個SwiftMailer的mailer實(shí)現(xiàn)

所有的Laravel contracts都存放在他們自己的GitHub倉庫中鬓照。這提供了一個快速導(dǎo)航熔酷,可以讓你定位到可用的contracts,還有獨(dú)立的,解耦的package讓package開發(fā)者可以用來開發(fā)豺裆。

Contracts和門面

Laravel的門面提供了一個利用Laravel服務(wù)的簡潔方法拒秘,不需要類型提示也不需要從服務(wù)容器中解析contracts。然而臭猜,用contracts可以為一個類定義明確的依賴躺酒。對于大多數(shù)應(yīng)用,門面很好用蔑歌。當(dāng)然羹应,如果你需要contracts提供的極度松耦合降宅,那就讀下去绊寻!

為什么要用Contracts

你可能有很多關(guān)于contracts的問題。為什么要用接口戚丸?用接口會不會更復(fù)雜劫灶?讓我們從下面幾點(diǎn)來挖掘用接口的理由:松耦合和簡潔裸违。

松耦合

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

<?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))    {
            //
        }
    }
}

在這個類中本昏,代碼對指定緩存實(shí)現(xiàn)緊耦合供汛。這是一個緊耦合因?yàn)槲覀円蕾囉趘endor包內(nèi)的固定的緩存。如果那個package內(nèi)的API發(fā)生的變化涌穆,我們的代碼也要變怔昨。
同樣的,如果我們想要把底層緩存技術(shù)(Mecached)替換成另一個技術(shù)(Redis)宿稀,我們必須修改倉庫趁舀。我們的倉庫無法得知誰提供了數(shù)據(jù)還有他們?nèi)绾翁峁?/p>

取而代之,我們可以改進(jìn)我們的代碼祝沸,讓它們依賴于一個簡單的矮烹,vendor無關(guān)的接口:

<?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;
    }
}

現(xiàn)在代碼不耦合于任何特定的vendor或者Laravel巡蘸。因?yàn)閏ontracts不包含任何實(shí)現(xiàn)和依賴,可以輕松為contract編寫可變實(shí)現(xiàn)擂送,你可以替換緩存實(shí)現(xiàn)而不用修改任何它服務(wù)的代碼悦荒。

簡潔

當(dāng)所有的Laravel服務(wù)都由簡單接口定義,明確給定服務(wù)提供的功能就會變得簡單嘹吨。contracts就像框架特征的一個簡潔文檔搬味。
另外,當(dāng)依賴簡單的接口蟀拷,你的代碼理解和維護(hù)起來就更簡單碰纬。不用再從龐大,復(fù)雜的類中查看哪個方法可以用问芬,你只要參考簡單干凈的接口就可以了悦析。

如何使用Contracts

你如何獲得一個contract實(shí)現(xiàn)?這很簡單此衅。
很多類型的類都是通過服務(wù)器容器解析的强戴,包括控制器、事件監(jiān)聽挡鞍、中間件骑歹、隊列工作甚至路由閉包。所以墨微,你只需要在要解析的類的構(gòu)造函數(shù)中類型提示接就可以獲得contract的實(shí)現(xiàn)了道媚。

例如,看看下面這個事件監(jiān)聽:

<?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)
    {
        //
    }
}

當(dāng)你的事件監(jiān)聽被解析翘县,服務(wù)容器會讀取構(gòu)造函數(shù)類型提示最域,然后注入適當(dāng)?shù)闹怠?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锈麸,隨后出現(xiàn)的幾起案子镀脂,更是在濱河造成了極大的恐慌,老刑警劉巖掐隐,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狗热,死亡現(xiàn)場離奇詭異钞馁,居然都是意外死亡虑省,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門僧凰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來探颈,“玉大人,你說我怎么就攤上這事训措∥苯冢” “怎么了光羞?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怀大。 經(jīng)常有香客問我纱兑,道長,這世上最難降的妖魔是什么化借? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任潜慎,我火速辦了婚禮,結(jié)果婚禮上蓖康,老公的妹妹穿的比我還像新娘铐炫。我一直安慰自己,他們只是感情好蒜焊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布倒信。 她就那樣靜靜地躺著,像睡著了一般泳梆。 火紅的嫁衣襯著肌膚如雪鳖悠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天优妙,我揣著相機(jī)與錄音竞穷,去河邊找鬼。 笑死鳞溉,一個胖子當(dāng)著我的面吹牛瘾带,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播熟菲,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼看政,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了抄罕?” 一聲冷哼從身側(cè)響起允蚣,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呆贿,沒想到半個月后嚷兔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡做入,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年冒晰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟块。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡壶运,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浪秘,到底是詐尸還是另有隱情蒋情,我是刑警寧澤埠况,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站棵癣,受9級特大地震影響辕翰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狈谊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一金蜀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧的畴,春花似錦渊抄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煎娇,卻和暖如春二庵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缓呛。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工催享, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哟绊。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓因妙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親票髓。 傳聞我的和親對象是個殘疾皇子攀涵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)洽沟,斷路器以故,智...
    卡卡羅2017閱讀 134,695評論 18 139
  • 先說幾句廢話,調(diào)和氣氛裆操。事情的起由來自客戶需求頻繁變更怒详,偉大的師傅決定橫刀立馬的改革使用新的框架(created ...
    wsdadan閱讀 3,054評論 0 12
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,607評論 0 121
  • 過去做事情急,什么東西拿起來就用踪区,不喜歡進(jìn)行系統(tǒng)性的學(xué)習(xí)昆烁,造成在使用過程中的錯誤和低效,現(xiàn)在感覺自己耐心多了朽缴,用之...
    馬文Marvin閱讀 1,987評論 0 10
  • 今天開始準(zhǔn)備寫作業(yè)善玫,云吞:一斤蝦水援,4兩肉密强,一斤蝦一湯匙芝麻粉茅郎,一湯匙大地魚粉,白芝麻炸了或渤,涼好裝瓶里系冗,需要時打磨成...
    慧蘭閱讀 156評論 0 0