前言
眾所周知,php的框架數不勝數,近幾年,一個以優雅著稱的框架,漸漸被國內phper所知道,并且開始使用,但是larave有一個很明顯的缺點就是,他的文檔內容少的可憐。
本文將給大家詳細介紹關于Laravel依賴注入的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
在 Laravel 的控制器的構造方法或者成員方法,都可以通過類型約束的方式使用依賴注入,如:
這里 $request 參數就使用了類型約束,Request 是一個類:\Illuminate\Http\Request,表示參數必須是這個類或子類。
本文通過分析 Laravel 的源碼,看為什么方法中不需要傳入實例就可以直接使用 Request 呢?只是框架自動幫我們實例化并傳參了。
1.路由定義
從源頭開始看起,在路由定義文件中定義了這么一個路由:
這是一個資源型的路由,Laravel 會自動生成增刪改查的路由入口。
本文開頭的 store 方法就是一個控制器的方法,圖中可見路由定義的 Action 也是:App\Http\Controllers\Admin\RoleController@store
路由方法解析
根據路由定義找到控制器和方法,執行具體的方法在 dispatch 方法中實現。
(文件:vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php)
首先 resolveClassMethodDependencies 方法,“顧名思義”是根據類的方法參數獲取依賴對象,然后再調用類的方法并把對象參數注入。
如果有多個依賴對象,也會 foreach 依次解析出來作為參數注入。
獲取依賴對象示例的代碼:
這里重點就是用到了 PHP 的反射,注意 RelectionMethod 方法,它獲取到類的方法參數列表,可以知道參數的類型約束,參數名稱等等。
這里的 $instance 參數就是 RoleController 控制器類,$method 參數就是方法名稱 strore.
2.獲取依賴對象的示例
從方法的參數中獲取了依賴對象的約束類型,就可以實例化這個依賴的對象。
根據類名從容器中獲取對象,這個綁定對象實例的過程在服務提供者中先定義和了。
然后把實例化的對象傳入到 store 方法中,就可以使用依賴的對象了。
3.關于 PHP 反射
舉個使用 ReflectionMethod 的例子。
打印出 new ReflectionMethod(Demo::class, ‘store') 的內容如圖:
可以得出這個方法的參數列表,參數的約束類型,如 typeHint,Illuminate\Http\Request.
根據類名可以從容器中獲取一開始通過服務提供者綁定的實例。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對編程學習網的支持。