最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎樣淺析Laravel底層原理的契約

本篇文章給大家分享的是有關(guān)怎樣淺析Laravel底層原理的契約,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

堆龍德慶網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)于2013年開始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

簡(jiǎn)介

Laravel 中的契約是指框架提供的一系列定義核心服務(wù)的接口(interface)。

例如,Illuminate\Contracts\Queue\Queue 契約定義了隊(duì)列任務(wù)所需的方法,而 Illuminate\Contracts\Mail\Mailer 契約定義了發(fā)送電子郵件所需的方法。

框架對(duì)每個(gè)契約都提供了相應(yīng)的實(shí)現(xiàn)。例如,Laravel 提供了具有各種驅(qū)動(dòng)的隊(duì)列實(shí)現(xiàn)和由 SwiftMailer 提供支持的郵件驅(qū)動(dòng)實(shí)現(xiàn)。

所有的 Laravel 契約都有他們自己的 GitHub 庫。這為所有可用的契約提供了一個(gè)快速參考指南,同時(shí)也可單獨(dú)作為低耦合的擴(kuò)展包給其他包開發(fā)者使用。

契約 VS. Facades

Laravel Facades 和輔助函數(shù)提供了一種使用 Laravel 服務(wù)的簡(jiǎn)單方法,即不需要通過類型提示并從服務(wù)容器中解析契約。在大多數(shù)情況下,每個(gè) Facades 都有一個(gè)等效的契約。

不同于門面不需要在構(gòu)造函數(shù)中進(jìn)行類型提示,契約允許你在類中定義顯式的依賴。一些開發(fā)者傾向于以契約這種方式明確地定義它們的依賴項(xiàng),而其它開發(fā)者則更喜歡 Facades 帶來的便捷。

對(duì)于大多數(shù)應(yīng)用程序來說,不管是使用門面還是契約都可以。但是,如果你正在構(gòu)建一個(gè)擴(kuò)展包,為了方便測(cè)試,你應(yīng)該強(qiáng)烈考慮契約。

何時(shí)使用契約

綜上所述,使用契約或是 Facades 很大程度上歸結(jié)于個(gè)人或者開發(fā)團(tuán)隊(duì)的喜好。不管是契約還是 Facades 都可以創(chuàng)建出健壯的、易測(cè)試的 Laravel 應(yīng)用程序。如果你長期關(guān)注類的單一職責(zé),你會(huì)注意到使用契約還是 Facades 其實(shí)沒多少實(shí)際意義上的區(qū)別。

然而,你可能還是會(huì)有幾個(gè)關(guān)于契約的問題。例如,為什么要使用接口?不使用接口會(huì)比較復(fù)雜嗎?下面讓我們談下使用接口的原因:低耦合和簡(jiǎn)單性。

低耦合

首先,讓我們來看一些高耦合緩存實(shí)現(xiàn)的代碼。如下:


namespace App\Orders;
class Repository{    /**     * 緩存實(shí)例。     */    protected $cache;
   /**     * 創(chuàng)建一個(gè)倉庫實(shí)例。     *     * @param  \SomePackage\Cache\Memcached  $cache     * @return void     */    public function __construct(\SomePackage\Cache\Memcached $cache){        $this->cache = $cache;    }
   /**     * 按照 Id 檢索訂單     *     * @param  int  $id     * @return Order     */    public function find($id){        if ($this->cache->has($id))    {            //        }    }}

在這個(gè)類中,程序與給定的緩存實(shí)現(xiàn)高耦合。因?yàn)槲覀円蕾囉谝粋€(gè)擴(kuò)展包的特定緩存類。一旦這個(gè)擴(kuò)展包的 API 被更改了,我們的代碼就必須跟著改變。

同樣的,如果我們想要將底層的的緩存技術(shù)( Memcached )替換為另一種緩存技術(shù)( redis ),那又得再次修改這個(gè) repository 類。而 repository 類不應(yīng)該了解太多關(guān)于誰提供了這些數(shù)據(jù)或是如何提供的等等。

比起上面的做法,我們可以使用一個(gè)簡(jiǎn)單的、與擴(kuò)展包無關(guān)的接口來改進(jìn)我們的代碼:


namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository{    /**     * 緩存實(shí)例。     */    protected $cache;
   /**     * 創(chuàng)建一個(gè)倉庫實(shí)例。     *     * @param  Cache  $cache     * @return void     */    public function __construct(Cache $cache){        $this->cache = $cache;    }}

現(xiàn)在,更改之后的代碼沒有與任何擴(kuò)展包甚至是 Laravel 耦合。而契約擴(kuò)展包不包含任何實(shí)現(xiàn)和依賴項(xiàng),你可以輕松地編寫任何給定契約的替代實(shí)現(xiàn),來實(shí)現(xiàn)不修改任何關(guān)于緩存消費(fèi)的代碼就可以替換緩存實(shí)現(xiàn)。

簡(jiǎn)單性

當(dāng)所有 Laravel 的服務(wù)都使用簡(jiǎn)潔的接口定義,就很容易判斷給定服務(wù)提供的功能??梢詫⑵跫s視為說明框架功能的簡(jiǎn)潔文檔。

除此之外,當(dāng)依賴的接口足夠簡(jiǎn)潔時(shí),代碼的可讀性和可維護(hù)性會(huì)大大提高。比起搜索一個(gè)大型復(fù)雜的類中有哪些可用的方法,不如檢索一個(gè)簡(jiǎn)單、 干凈的接口來參考更妥當(dāng)。

如何使用契約

Laravel 中的許多類型的類都是通過 服務(wù)容器 解析出來的,包括控制器、事件監(jiān)聽器、中間件、任務(wù)隊(duì)列,甚至路由閉包。所以,要獲得一個(gè)契約的實(shí)現(xiàn),你只需要在被解析的類的構(gòu)造函數(shù)中添加「類型提示」即可。

例如,看看這個(gè)事件監(jiān)聽器:


namespace App\Listeners;
use App\User;use App\Events\OrderWasPlaced;use Illuminate\Contracts\Redis\Database;
class CacheOrderInformation{    /**     * Redis 數(shù)據(jù)庫實(shí)現(xiàn)。     */    protected $redis;
   /**     * 創(chuàng)建事件處理器實(shí)例。     *     * @param  Database  $redis     * @return void     */    public function __construct(Database $redis){        $this->redis = $redis;    }
   /**     * 處理事件。     *     * @param  OrderWasPlaced  $event     * @return void     */    public function handle(OrderWasPlaced $event){        //    }}

當(dāng)事件監(jiān)聽器被解析時(shí),服務(wù)容器會(huì)讀取類的構(gòu)造函數(shù)上的類型提示,并注入對(duì)應(yīng)的值。

以上就是怎樣淺析Laravel底層原理的契約,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞標(biāo)題:怎樣淺析Laravel底層原理的契約
網(wǎng)站地址:http://fisionsoft.com.cn/article/jdegig.html