国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

Laravel5中contracts詳解

2020-03-22 18:32:45
字體:
來源:轉載
供稿:網友
我們先來看看官方文檔中對contracts的定義:Laravel's Contracts are a set of interfaces that define the core services provided by the framework.
意思是說Laravel的Contracts是一個由 框架提供 的定義了 核心服務接口 的集合。也就是說,每一個Contract都是一個接口,對應一個框架核心服務。那它的意義何在?網址給出的解釋也很簡單:使用接口是為了 松耦合 和 簡單 。先不講大道理,先來點干貨,看看怎么使用contract先瀏覽下contracts接口列表:復制代碼 代碼如下:
Illuminate/Contracts/Auth/Guard
Illuminate/Contracts/Auth/PasswordBroker
Illuminate/Contracts/Bus/Dispatcher
Illuminate/Contracts/Cache/Repository
Illuminate/Contracts/Cache/Factory
Illuminate/Contracts/Config/Repository
Illuminate/Contracts/Container/Container
Illuminate/Contracts/html' target='_blank'>Cookie/Factory
Illuminate/Contracts/Cookie/QueueingFactory
Illuminate/Contracts/Encryption/Encrypter
Illuminate/Contracts/Routing/Registrar
…… 太多了,懶得繼續貼了,網址手冊里有。我們就拿 Illuminate/Contracts/Routing/Registrar 這個contract來演示一下吧。
首先,打開 app/Providers/AppServiceProvider.php,注意register方法:復制代碼 代碼如下:
public function register()
{
$this- app- bind(
'Illuminate/Contracts/Auth/Registrar',
'App/Services/Registrar'
);
}
$this- app 就是Application對象,也是容器對象,通過 $this- app- bind 方法我們綁定了一個實現Illuminate/Contracts/Auth/Registrar接口的類App/Services/Registrar。注意,Illuminate/Contracts/Auth/Registrar就是一個contract。App/Services/Registrar 這個類文件在 app/Services/Registrar.php。接著我們看 App/Http/Controllers/Auth/AuthController 這個控制器類,看到它有 __construct 構造函數:復制代碼 代碼如下:
public function __construct(Guard $auth, Registrar $registrar)
{
$this- auth = $auth;
$this- registrar = $registrar; $this- middleware('guest', ['except' = 'getLogout']);
}
它有兩個參數,對應的類命名空間在腳本開頭可以看到:復制代碼 代碼如下:
use Illuminate/Contracts/Auth/Guard;
use Illuminate/Contracts/Auth/Registrar;
這兩個都是contract,但我們這里就拿 Registrar 說,我們注意到這里面只是通過參數類型指明了$registrar的接口類型,而實際調用的時候實際上是 App/Services/Registrar 這個類,這就是依賴注入的特性了,Laravel會自動在容器中搜索實現了接口Illuminate/Contracts/Auth/Registrar的類或對象,有的話就取出來作為實際參數傳到構造函數里。整個使用流程其實就可以總結為兩個步驟:向容器中注冊實現contract接口的對象。
構造函數參數類型指定為contract接口類,框架會自動找到符合條件的對象。
那么再來說說contract的好處。松耦合網址給了一個例子解釋什么是緊耦合以及Contract接口為何能夠松耦合。先來看看緊耦合的代碼:復制代碼 代碼如下:
php namespace App/Orders;
class Repository {
/**
* The cache.
*/
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))
{
//
}
}
}
可以看到構造函數中注入了一個詳細的緩存實現 /SomePackage/Cache/Memcached ,如果換Redis作為緩存服務器或者更改了api方法,就需要修改,而如果項目很大,你不知道還有多少地方需要修改。那么,Contract接口是如何解決這個問題的?請看代碼:復制代碼 代碼如下:
php namespace App/Orders;
use Illuminate/Contracts/Cache/Repository as Cache;
class Repository {
/**
* Create a new repository instance.
*
* @param Cache $cache
* @return void
*/
public function __construct(Cache $cache)
{
$this- cache = $cache;
}
}
注意,緩存實現我們使用了一個接口,也就是contract,Illuminate/Contracts/Cache/Repository,因為它只是接口,不需要關心背后是memcache還是redis。簡單性如果所有服務都使用接口定義,就可以很簡單的決定一個服務需要的功能,更加容易維護和擴展,并且contract接口還能看作一個簡潔的文檔便于閱讀。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖江市| 溧水县| 灵丘县| 陕西省| 乌拉特中旗| 广饶县| 保德县| 喜德县| 奈曼旗| 南召县| 靖江市| 广元市| 大荔县| 南木林县| 临汾市| 浦县| 三门峡市| 内乡县| 凤庆县| 松溪县| 永春县| 通州区| 南平市| 潜江市| 台北县| 阳曲县| 新安县| 柳江县| 寻甸| 同江市| 和林格尔县| 日照市| 宜丰县| 凌海市| 韶山市| 南投市| 阿合奇县| 集安市| 西吉县| 潼南县| 务川|