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