摘要:的核心概念包括服務(wù)容器服務(wù)提供者門面契約。所有服務(wù)提供者都需要繼承類。可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊(cè)之后調(diào)用。同樣會(huì)整理成思維導(dǎo)圖的形式以方便記憶與回顧。
Laravel 的核心概念包括:服務(wù)容器、服務(wù)提供者、門面(Facades)、契約(Contracts)。
服務(wù)容器是 Laravel 的核心,是一個(gè) IoC 容器,是管理類依賴和運(yùn)行依賴注入的有力工具。
服務(wù)提供者則提供服務(wù)并綁定服務(wù)至服務(wù)容器。是所有 Laravel 應(yīng)用程序引導(dǎo)啟動(dòng)的中心所在。
Facades 為應(yīng)用程序的服務(wù)容器中可用的類提供了一個(gè)「靜態(tài)」接口。它實(shí)際上是服務(wù)容器中那些底層類的「靜態(tài)代理」。
Laravel 的 契約(Contracts )是一系列框架用來定義核心服務(wù)的接口。
不管是契約還是門面都可以創(chuàng)建出強(qiáng)大的、容易測(cè)試的 Laravel 應(yīng)用程序。
0x00 服務(wù)容器Laravel 的核心就是一個(gè) IoC 容器,該容器提供了整個(gè)框架中需要的一系列服務(wù)。
IoC(Inversion Of Control)控制反轉(zhuǎn),是面向?qū)ο缶幊讨械囊环N設(shè)計(jì)原則,可以用來減低計(jì)算機(jī)代碼之間的耦合度。IoC 容器會(huì)根據(jù)類的依賴需求,自動(dòng)在注冊(cè)、綁定的一堆實(shí)例中搜尋符合的依賴需求,并自動(dòng)注入到構(gòu)造函數(shù)參數(shù)中去。通過控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴的對(duì)象的引用傳遞給它。也可以說,依賴被注入到對(duì)象中。這就是依賴注入(Dependency Injection, DI)。依賴注入實(shí)質(zhì)上是指:類的依賴通過構(gòu)造器或在某些情況下通過「setter」方法進(jìn)行「注入」。
如何實(shí)現(xiàn)與服務(wù)容器的綁定?幾乎所有服務(wù)容器的綁定都是在服務(wù)提供者中進(jìn)行的。在服務(wù)提供者內(nèi)部,可以通過 $this->app 來訪問容器的實(shí)例。
綁定的方式包括:
簡(jiǎn)單綁定
綁定一個(gè)單例
綁定實(shí)例
綁定接口到實(shí)現(xiàn)
情境綁定
綁定包括原始數(shù)據(jù)在內(nèi)的初始數(shù)據(jù)
標(biāo)記
其中,標(biāo)記能夠針對(duì)某種類別的所有做綁定。
如何從服務(wù)容器解析出對(duì)象?綁定后可以從服務(wù)容器中解析出對(duì)象才能夠使用。解析方法包括:
通過 make 方法,接收一個(gè)你想要解析的類或者接口
通過數(shù)組方式從容器中解析對(duì)象
自動(dòng)注入
自動(dòng)注入實(shí)例下面的例子中,在控制器的構(gòu)造函數(shù)中對(duì)應(yīng)用程序定義的 Repository 使用類型提示。這樣 Repository 實(shí)例會(huì)被自動(dòng)解析并注入到類中:
users = $users; } /** * 顯示指定 ID 的用戶信息。 * * @param int $id * @return Response */ public function show($id) { // } }0x01 服務(wù)提供者
Laravel 中,包括應(yīng)用程序,以及所有的 Laravel 核心服務(wù),都是通過服務(wù)提供者引導(dǎo)啟動(dòng)的。所謂的「引導(dǎo)啟動(dòng)」指的是注冊(cè)事務(wù),包括注冊(cè)服務(wù)容器綁定,事件監(jiān)聽器,中間件,甚至路由。
所有服務(wù)提供者都需要繼承 IlluminateSupportServiceProvider 類。大多數(shù)服務(wù)提供者都包含 register 和 boot 方法。register 方法中,只能將事務(wù)綁定到 服務(wù)容器。不應(yīng)該在 register 方法中嘗試注冊(cè)任何事件監(jiān)聽器,路由或者任何其他功能。可以為服務(wù)提供者的 boot 方法設(shè)置類型提示。服務(wù)容器會(huì)自動(dòng)注入需要的任何依賴。boot 方法將在所有其他服務(wù)提供者均已注冊(cè)之后調(diào)用。
所有服務(wù)提供者都在 config/app.php 配置文件中注冊(cè)。可以選擇推遲服務(wù)提供者的注冊(cè),直到真正需要注冊(cè)綁定時(shí),這樣可以提供應(yīng)用程序的性能。
0x02 門面(Facades) Facades 工作原理在 Laravel 應(yīng)用中,一個(gè) facade 就是一個(gè)提供訪問容器中對(duì)象的類。其中核心的部件就是 Facade 類。不管是 Laravel 自帶的 Facades ,還是用戶自定義的 Facades ,都繼承自 IlluminateSupportFacadesFacade 類。
Facade 基類使用 __callStatic() 魔術(shù)方法在你的 Facades 中延遲調(diào)用容器中對(duì)應(yīng)對(duì)象的方法,在下面的例子中,調(diào)用了 Laravel 的緩存系統(tǒng)。在代碼里,我們可能認(rèn)為是 Cache 類中的靜態(tài)方法 get 被調(diào)用了:
$user]); } }
注意在代碼的最上面,我們導(dǎo)入的是 Cache facade 。這個(gè) facade 其實(shí)是我們獲取底層 IlluminateContractsCacheFactory 接口實(shí)現(xiàn)的一個(gè)代理。我們通過這個(gè) facade 調(diào)用的任何方法,都會(huì)被傳遞到 Laravel 緩存服務(wù)的底層實(shí)例中。
如果我們看一下 IlluminateSupportFacadesCache 這個(gè)類,你會(huì)發(fā)現(xiàn)類中根本沒有 get 這個(gè)靜態(tài)方法:
class Cache extends Facade { /** * 獲取組件在容器中注冊(cè)的名稱。 * * @return string */ protected static function getFacadeAccessor() { return "cache"; } }
其實(shí),Cache facade 是繼承了 Facade 基類,并且定義了 getFacadeAccessor() 方法。這個(gè)方法的作用是返回服務(wù)容器中對(duì)應(yīng)名字的綁定內(nèi)容。當(dāng)用戶調(diào)用 Cache facade 中的任何靜態(tài)方法時(shí), Laravel 會(huì)解析到服務(wù)容器中綁定的鍵值為 cache 實(shí)例對(duì)象,并調(diào)用這個(gè)對(duì)象對(duì)應(yīng)的方法(在這個(gè)例子中就是 get 方法)。
0x03 契約(Contracts) 如何使用契約?Laravel 中的許多類型的類都是通過 服務(wù)容器 解析出來的。包括控制器、事件監(jiān)聽器、中間件、任務(wù)隊(duì)列,甚至路由的閉包。所以說,要獲得一個(gè)契約的實(shí)現(xiàn),你只需要解析在類的構(gòu)造函數(shù)中相應(yīng)的類型約束即可。
例如,看看這個(gè)事件監(jiān)聽器,當(dāng)事件監(jiān)聽器被解析時(shí),服務(wù)容器會(huì)從構(gòu)造函數(shù)里讀取到類型約束,并注入對(duì)應(yīng)的值。
redis = $redis; } /** * 處理事件。 * * @param OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // } }下一步
Laravel 作為“為 Web 藝術(shù)家創(chuàng)造的 PHP 框架”,接下來我將學(xué)習(xí)其中最重要的內(nèi)容之一 HTTP 層的相關(guān)知識(shí)。同樣會(huì)整理成思維導(dǎo)圖的形式以方便記憶與回顧。
這些文章都將首發(fā)在微信公眾號(hào):up2048 上。歡迎大家掃描下面的二維碼,我們一起學(xué)習(xí),分享,討論,反思。
思維導(dǎo)圖導(dǎo)出為圖片時(shí)會(huì)導(dǎo)致其變模糊。若需要高清的思維導(dǎo)圖源文件,請(qǐng)關(guān)注微信公眾號(hào):up2048,并回復(fù)“精進(jìn)腦圖”來獲取。
- EOF -
推薦閱讀Laravel思維導(dǎo)圖之Laravel入門指南
十五張思維導(dǎo)圖帶你快速學(xué)習(xí)PHP言語(yǔ)基礎(chǔ)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25701.html
摘要:又限于層的內(nèi)容太多,我在這篇中將整理路由中間件控制器部分內(nèi)容。前者定義頁(yè)面路由,默認(rèn)應(yīng)用中間件組后者定義無狀態(tài)路由,會(huì)應(yīng)用中間件組。命名路由可以為指定路由或者控制器方法命名,也可以為已命名的路由生成。 showImg(https://segmentfault.com/img/remote/1460000010882838); 上圖列出了 Laravel HTTP 層的相關(guān)知識(shí)大綱。由于...
摘要:今天我來分享中層關(guān)于請(qǐng)求響應(yīng)與表單驗(yàn)證的知識(shí)。手動(dòng)創(chuàng)建驗(yàn)證請(qǐng)求之前的內(nèi)容是直接使用的方法來實(shí)現(xiàn)表單驗(yàn)證。下一步到這篇為止,我完成了入門指南核心概念層的路由中間件控制器請(qǐng)求響應(yīng)表單驗(yàn)證的學(xué)習(xí)和整理。 showImg(https://segmentfault.com/img/remote/1460000010882838); 今天我來分享 Laravel 中 HTTP 層關(guān)于請(qǐng)求、響應(yīng)與表...
摘要:本系列思維導(dǎo)圖整理自版本官方文檔。思維導(dǎo)圖導(dǎo)出為圖片時(shí)會(huì)導(dǎo)致其變模糊。需要高清的思維導(dǎo)圖源文件,請(qǐng)關(guān)注微信公眾號(hào),并回復(fù)精進(jìn)腦圖來獲取。今天我們就通過張思維導(dǎo)圖來快速看入門指南。這些文章都將首發(fā)在微信公眾號(hào)上。 showImg(https://segmentfault.com/img/remote/1460000010774258); 本系列思維導(dǎo)圖整理自 Laravel 5.4 版...
摘要:為了一探究竟,于是開啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時(shí)編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過程踩的很多坑之后,我們最終完善并實(shí)施了初步的性能測(cè)試方案,通過真實(shí)的測(cè)試數(shù)據(jù)歸納出了 Laravel 開發(fā)過程中的一些實(shí)踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應(yīng)用程序響應(yīng)有點(diǎn)慢、20幾個(gè)并...
摘要:思維導(dǎo)圖導(dǎo)出為圖片時(shí)會(huì)導(dǎo)致其變模糊。需要高清的思維導(dǎo)圖源文件,請(qǐng)關(guān)注微信公眾號(hào),并回復(fù)精進(jìn)腦圖來獲取。下面我們就通過張思維導(dǎo)圖來快速學(xué)習(xí)語(yǔ)言基礎(chǔ)。這些文章都將首發(fā)在微信公眾號(hào)上。 showImg(https://segmentfault.com/img/remote/1460000010743585); 在打算系統(tǒng)的學(xué)習(xí) Laravel 之前,我抽空看了 PHP 語(yǔ)言基礎(chǔ),并且繪制了...
閱讀 2407·2021-10-14 09:43
閱讀 2440·2021-09-09 09:34
閱讀 1604·2019-08-30 12:57
閱讀 1207·2019-08-29 14:16
閱讀 723·2019-08-26 12:13
閱讀 3204·2019-08-26 11:45
閱讀 2288·2019-08-23 16:18
閱讀 2660·2019-08-23 15:27