好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Laravel框架下的Contracts契約詳解

Laravel框架下的Contracts契約詳解

熱門標簽:辦理400電話哪家好點 嘟嘟云外呼系統 正規電銷機器人系統 南京3D地圖標注 邢臺400電話辦理 重慶外呼電銷系統多少錢 咸陽電銷 南寧電話外呼系統線路 濟源百應電銷機器人聯系方式

Contracts

Laravel 的契約是一組定義框架提供的核心服務的接口, 例如我們在介紹用戶認證的章節中到的用戶看守器契約IllumninateContractsAuthGuard 和用戶提供器契約IlluminateContractsAuthUserProvider以及框架自帶的App\User模型所實現的IlluminateContractsAuthAuthenticatable契約。

為什么使用契約

通過上面幾個契約的源碼文件我們可以看到,Laravel提供的契約是為核心模塊定義的一組interface。Laravel為每個契約都提供了相應的實現類,下表列出了Laravel為上面提到的三個契約提供的實現類。

所以在自己開發的項目中,如果Laravel提供的用戶認證系統無法滿足需求,你可以根據需求定義看守器和用戶提供器的實現類,比如我之前做的項目就是用戶認證依賴于公司的員工管理系統的API,所以我就自己寫了看守器和用戶提供器契約的實現類,讓Laravel通過自定義的Guard和UserProvider來完成用戶認證。自定義用戶認證的方法在介紹用戶認證的章節中我們介紹過,讀者可以去翻閱那塊的文章。

所以Laravel為所有的核心功能都定義契約接口的目的就是為了讓開發者能夠根據自己項目的需要自己定義實現類,而對于這些接口的消費者(比如:Controller、或者內核提供的 AuthManager這些)他們不需要關心接口提供的方法具體是怎么實現的, 只關心接口的方法能提供什么功能然后去使用這些功能就可以了,我們可以根據需求在必要的時候為接口更換實現類,而消費端不用進行任何改動。

定義和使用契約

上面我們提到的都是Laravel內核提供的契約, 在開發大型項目的時候我們也可以自己在項目中定義契約和實現類,你有可能會覺得自帶的Controller、Model兩層就已經足夠你編寫代碼了,憑空多出來契約和實現類會讓開發變得繁瑣。我們先從一個簡單的例子出發,考慮下面的代碼有什么問題:

class OrderController extends Controller
{
 public function getUserOrders()
 {
  $orders= Order::where('user_id', '=', \Auth::user()->id)->get();
  return View::make('order.index', compact('orders'));
 }
}

這段代碼很簡單,但我們要想測試這段代碼的話就一定會和實際的數據庫發生聯系。

也就是說, ORM和這個控制器有著緊耦合。如果不使用Eloquent ORM,不連接到實際數據庫,我們就沒辦法運行或者測試這段代碼。這段代碼同時也違背了“關注分離”這個軟件設計原則。

簡單講:這個控制器知道的太多了。

控制器不需要去了解數據是從哪兒來的,只要知道如何訪問就行。控制器也不需要知道這數據是從MySQL或哪兒來的,只需要知道這數據目前是可用的。

Separation Of Concerns 關注分離

Every class should have a single responsibility, and that responsibility should be entirely encapsulated by the class.

每個類都應該只有單一的職責,并且職責里所有的東西都應該由這個類封裝

接下來我們定義一個接口,然后實現該接口

interface OrderRepositoryInterface 
{
 public function userOrders(User $user);
}
class OrderRepository implements OrderRepositoryInterface
{
 public function userOrders(User $user)
 {
  Order::where('user_id', '=', $user->id)->get();
 }
} 

將接口的實現綁定到Laravel的服務容器中

App::singleton('OrderRepositoryInterface', 'OrderRespository');  

然后我們將該接口的實現注入我們的控制器

class UserController extends Controller
{
 public function __construct(OrderRepositoryInterface $orderRepository)
 {
  $this->orders = $orderRespository;
 }
 public function getUserOrders()
 {
  $orders = $this->orders->userOrders();
  return View::make('order.index', compact('orders'));
 }
}

現在我們的控制器就完全和數據層面無關了。在這里我們的數據可能來自MySQL,MongoDB或者Redis。我們的控制器不知道也不需要知道他們的區別。這樣我們就可以獨立于數據層來測試Web層了,將來切換存儲實現也會很容易。

接口與團隊開發

當你的團隊在開發大型應用時,不同的部分有著不同的開發速度。

比如一個開發人員在開發數據層,另一個開發人員在做控制器層。

寫控制器的開發者想測試他的控制器,不過數據層開發較慢沒法同步測試。那如果兩個開發者能先以interface的方式達成協議,后臺開發的各種類都遵循這種協議。

一旦建立了約定,就算約定還沒實現,開發者也可以為這接口寫個“假”實現

class DummyOrderRepository implements OrderRepositoryInterface 
{
 public function userOrders(User $user)
 {
  return collect(['Order 1', 'Order 2', 'Order 3']);
 }
} 

一旦假實現寫好了,就可以被綁定到IoC容器里

App::singleton('OrderRepositoryInterface', 'DummyOrderRepository');

然后這個應用的視圖就可以用假數據填充了。接下來一旦后臺開發者寫完了真正的實現代碼,比如叫RedisOrderRepository。

那么使用IoC容器切換接口實現,應用就可以輕易地切換到真正的實現上,整個應用就會使用從Redis讀出來的數據了。

接口與測試

建立好接口約定后也更有利于我們在測試時進行Mock

public function testIndexActionBindsUsersFromRepository()
{ 
 // Arrange...
 $repository = Mockery::mock('OrderRepositoryInterface');
 $repository->shouldReceive('userOrders')->once()->andReturn(['order1', 'order2]);
 App::instance('OrderRepositoryInterface', $repository);
 // Act...
 $response = $this->action('GET', 'OrderController@getUserOrders');
 // Assert...
 $this->assertResponseOk();
 $this->assertViewHas('order', ['order1', 'order2']);
 } 

總結

接口在程序設計階段非常有用,在設計階段與團隊討論完成功能需要制定哪些接口,然后設計出每個接口具體要實現的方法,方法的入參和返回值這些,每個人就可以按照接口的約定來開發自己的模塊,遇到還沒實現的接口完全可以先定義接口的假實現等到真正的實現開發完成后再進行切換,這樣既降低了軟件程序結構中上層對下層的耦合也能保證各部分的開發進度不會過度依賴其他部分的完成情況。

到此這篇關于解析Laravel框架下的Contracts契約的文章就介紹到這了,更多相關laravel contracts契約 內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Laravel源碼解析之路由的使用和示例詳解
  • 通過源碼解析Laravel的依賴注入
  • 源碼分析 Laravel 重復執行同一個隊列任務的原因
  • Laravel 框架控制器 Controller原理與用法實例分析
  • Laravel 框架路由原理與路由訪問實例分析
  • 4種Windows系統下Laravel框架的開發環境安裝及部署方法詳解
  • Laravel框架數據庫遷移操作實例詳解
  • laravel框架路由分組,中間件,命名空間,子域名,路由前綴實例分析
  • laravel框架使用FormRequest進行表單驗證,驗證異常返回JSON操作示例
  • Laravel框架源碼解析之反射的使用詳解

標簽:唐山 黃山 通遼 河南 武漢 隴南 南通 平頂山

巨人網絡通訊聲明:本文標題《Laravel框架下的Contracts契約詳解》,本文關鍵詞  Laravel,框架,下,的,Contracts,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Laravel框架下的Contracts契約詳解》相關的同類信息!
  • 本頁收集關于Laravel框架下的Contracts契約詳解的相關信息資訊供網民參考!
  • 推薦文章