您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)怎樣淺析Laravel底層原理的契約,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
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 庫(kù)。這為所有可用的契約提供了一個(gè)快速參考指南,同時(shí)也可單獨(dú)作為低耦合的擴(kuò)展包給其他包開發(fā)者使用。
Laravel Facades 和輔助函數(shù)提供了一種使用 Laravel 服務(wù)的簡(jiǎn)單方法,即不需要通過(guò)類型提示并從服務(wù)容器中解析契約。在大多數(shù)情況下,每個(gè) Facades 都有一個(gè)等效的契約。
不同于門面不需要在構(gòu)造函數(shù)中進(jìn)行類型提示,契約允許你在類中定義顯式的依賴。一些開發(fā)者傾向于以契約這種方式明確地定義它們的依賴項(xiàng),而其它開發(fā)者則更喜歡 Facades 帶來(lái)的便捷。
對(duì)于大多數(shù)應(yīng)用程序來(lái)說(shuō),不管是使用門面還是契約都可以。但是,如果你正在構(gòu)建一個(gè)擴(kuò)展包,為了方便測(cè)試,你應(yīng)該強(qiáng)烈考慮契約。
綜上所述,使用契約或是 Facades 很大程度上歸結(jié)于個(gè)人或者開發(fā)團(tuán)隊(duì)的喜好。不管是契約還是 Facades 都可以創(chuàng)建出健壯的、易測(cè)試的 Laravel 應(yīng)用程序。如果你長(zhǎng)期關(guān)注類的單一職責(zé),你會(huì)注意到使用契約還是 Facades 其實(shí)沒(méi)多少實(shí)際意義上的區(qū)別。
然而,你可能還是會(huì)有幾個(gè)關(guān)于契約的問(wèn)題。例如,為什么要使用接口?不使用接口會(huì)比較復(fù)雜嗎?下面讓我們談下使用接口的原因:低耦合和簡(jiǎn)單性。
首先,讓我們來(lái)看一些高耦合緩存實(shí)現(xiàn)的代碼。如下:
<?php
namespace App\Orders;
class Repository
{
/**
* 緩存實(shí)例。
*/
protected $cache;
/**
* 創(chuàng)建一個(gè)倉(cāng)庫(kù)實(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)于誰(shuí)提供了這些數(shù)據(jù)或是如何提供的等等。
比起上面的做法,我們可以使用一個(gè)簡(jiǎn)單的、與擴(kuò)展包無(wú)關(guān)的接口來(lái)改進(jìn)我們的代碼:
<?php
namespace App\Orders;
use Illuminate\Contracts\Cache\Repository as Cache;
class Repository
{
/**
* 緩存實(shí)例。
*/
protected $cache;
/**
* 創(chuàng)建一個(gè)倉(cāng)庫(kù)實(shí)例。
*
* @param Cache $cache
* @return void
*/
public function __construct(Cache $cache)
{
$this->cache = $cache;
}
}
現(xiàn)在,更改之后的代碼沒(méi)有與任何擴(kuò)展包甚至是 Laravel 耦合。而契約擴(kuò)展包不包含任何實(shí)現(xiàn)和依賴項(xiàng),你可以輕松地編寫任何給定契約的替代實(shí)現(xiàn),來(lái)實(shí)現(xiàn)不修改任何關(guān)于緩存消費(fèi)的代碼就可以替換緩存實(shí)現(xiàn)。
當(dāng)所有 Laravel 的服務(wù)都使用簡(jiǎn)潔的接口定義,就很容易判斷給定服務(wù)提供的功能。可以將契約視為說(shuō)明框架功能的簡(jiǎn)潔文檔。
除此之外,當(dāng)依賴的接口足夠簡(jiǎn)潔時(shí),代碼的可讀性和可維護(hù)性會(huì)大大提高。比起搜索一個(gè)大型復(fù)雜的類中有哪些可用的方法,不如檢索一個(gè)簡(jiǎn)單、 干凈的接口來(lái)參考更妥當(dāng)。
Laravel 中的許多類型的類都是通過(guò) 服務(wù)容器 解析出來(lái)的,包括控制器、事件監(jiān)聽器、中間件、任務(wù)隊(duì)列,甚至路由閉包。所以,要獲得一個(gè)契約的實(shí)現(xiàn),你只需要在被解析的類的構(gòu)造函數(shù)中添加「類型提示」即可。
例如,看看這個(gè)事件監(jiān)聽器:
<?php
namespace App\Listeners;
use App\User;
use App\Events\OrderWasPlaced;
use Illuminate\Contracts\Redis\Database;
class CacheOrderInformation
{
/**
* Redis 數(shù)據(jù)庫(kù)實(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ì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。