pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

通過源碼解析Laravel的依賴注入

這篇文章主要給大家介紹了如何通過源碼解析Laravel的依賴注入的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著

前言

眾所周知,php的框架數不勝數,近幾年,一個以優雅著稱的框架,漸漸被國內phper所知道,并且開始使用,但是larave有一個很明顯的缺點就是,他的文檔內容少的可憐。

本文將給大家詳細介紹關于Laravel依賴注入的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

在 Laravel 的控制器的構造方法或者成員方法,都可以通過類型約束的方式使用依賴注入,如:


public function store(Request $request)
{
 //TODO
}

這里 $request 參數就使用了類型約束,Request 是一個類:\Illuminate\Http\Request,表示參數必須是這個類或子類。

本文通過分析 Laravel 的源碼,看為什么方法中不需要傳入實例就可以直接使用 Request 呢?只是框架自動幫我們實例化并傳參了。

1.路由定義

從源頭開始看起,在路由定義文件中定義了這么一個路由:


Route::resource('/role', 'Admin\RoleController');

這是一個資源型的路由,Laravel 會自動生成增刪改查的路由入口。

本文開頭的 store 方法就是一個控制器的方法,圖中可見路由定義的 Action 也是:App\Http\Controllers\Admin\RoleController@store

路由方法解析

根據路由定義找到控制器和方法,執行具體的方法在 dispatch 方法中實現。

(文件:vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php)


public function dispatch(Route $route, $controller, $method)
{
 $parameters = $this->resolveClassMethodDependencies(
  $route->parametersWithoutNulls(), $controller, $method
 );
 
 if (method_exists($controller, 'callAction')) {
  return $controller->callAction($method, $parameters);
 }
 
 return $controller->{$method}(...array_values($parameters));
}

首先 resolveClassMethodDependencies 方法,“顧名思義”是根據類的方法參數獲取依賴對象,然后再調用類的方法并把對象參數注入。

如果有多個依賴對象,也會 foreach 依次解析出來作為參數注入。

獲取依賴對象示例的代碼:


protected function resolveClassMethodDependencies(array $parameters, $instance, $method)
{
 if (! method_exists($instance, $method)) {
  return $parameters;
 }
 
 return $this->resolveMethodDependencies(
  $parameters, new ReflectionMethod($instance, $method)
 );
}

這里重點就是用到了 PHP 的反射,注意 RelectionMethod 方法,它獲取到類的方法參數列表,可以知道參數的類型約束,參數名稱等等。

這里的 $instance 參數就是 RoleController 控制器類,$method 參數就是方法名稱 strore.

2.獲取依賴對象的示例

從方法的參數中獲取了依賴對象的約束類型,就可以實例化這個依賴的對象。


protected function transformDependency(ReflectionParameter $parameter, $parameters)
{
 $class = $parameter->getClass(); 
 // If the parameter has a type-hinted class, we will check to see if it is already in
 // the list of parameters. If it is we will just skip it as it is probably a model
 // binding and we do not want to mess with those; otherwise, we resolve it here.
 if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {
  return $parameter->isDefaultValueAvailable()
   ? $parameter->getDefaultValue()
   : $this->container->make($class->name);
 }
}

根據類名從容器中獲取對象,這個綁定對象實例的過程在服務提供者中先定義和了。

然后把實例化的對象傳入到 store 方法中,就可以使用依賴的對象了。

3.關于 PHP 反射

舉個使用 ReflectionMethod 的例子。


class Demo
{
 private $request;
 public function store(Request $request)
 {
 }
}

打印出 new ReflectionMethod(Demo::class, ‘store') 的內容如圖:

可以得出這個方法的參數列表,參數的約束類型,如 typeHint,Illuminate\Http\Request.

根據類名可以從容器中獲取一開始通過服務提供者綁定的實例。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對編程學習網的支持。

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要給大家介紹了關于Laravel中unique和exists驗證規則的優化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面
Gravatar是一圖像跟隨著您到訪過的網站,當您在博客中留言或發表文章,它將會出現在您的名稱旁。下面這篇文章主要給大家介紹了關于利用Laravel如何生成 Gravatar 頭像地址的優雅方法,
Laravel隊列服務為各種不同的后臺隊列提供統一的API,下面這篇文章主要給大家介紹了關于Laravel中使用Queue的最基本操作教程,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借
這篇文章主要給大家介紹了關于 Laravel Redis 多個進程同時取隊列問題的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友下面來
laravel 的隊列服務對各種不同的后臺隊列服務提供了統一的 API,下面這篇文章通過源碼分析給大家介紹了關于 Laravel 重復執行同一個隊列任務的原因,文中通過示例代碼介紹的非常詳細
最近在使用laravel5.5,利用其實現了一個功能,下面分享給大家,這篇文章主要給大家介紹了關于Laravel 5.5基于內置的Auth模塊如何實現前后臺登陸的相關資料,文中通過示例代碼介紹的非
主站蜘蛛池模板: 山东螺杆空压机,烟台空压机,烟台开山空压机-烟台开山机电设备有限公司 | 南京蜂窝纸箱_南京木托盘_南京纸托盘-南京博恒包装有限公司 | 恒温恒湿试验箱_高低温试验箱_恒温恒湿箱-东莞市高天试验设备有限公司 | 菲希尔FISCHER测厚仪-铁素体检测仪-上海吉馨实业发展有限公司 | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 食品级焦亚硫酸钠_工业级焦亚硫酸钠_焦亚硫酸钠-潍坊邦华化工有限公司 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | Jaeaiot捷易科技-英伟达AI显卡模组/GPU整机服务器供应商 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 海峰资讯 - 专注装饰公司营销型网站建设和网络营销培训 | 西门子伺服控制器维修-伺服驱动放大器-828D数控机床维修-上海涌迪 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 玻璃钢板-玻璃钢防腐瓦-玻璃钢材料-广东壹诺 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 山西3A认证|太原AAA信用认证|投标AAA信用证书-山西AAA企业信用评级网 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 99文库_实习生实用的范文资料文库站 | ge超声波测厚仪-电动涂膜机-电动划格仪-上海洪富 | 北京燃气公司 用户服务中心 | b2b网站大全,b2b网站排名,找b2b网站就上地球网 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 高博医疗集团上海阿特蒙医院| 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 步进_伺服_行星减速机,微型直流电机,大功率直流电机-淄博冠意传动机械 | 球磨机 选矿球磨机 棒磨机 浮选机 分级机 选矿设备厂家 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 挨踢网-大家的导航!| 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 滚筒线,链板线,总装线,流水线-上海体能机电有限公司 |