欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年01月22日 08:43:41   作者:小談  
這篇文章主要給大家介紹了如何通過源碼解析Laravel的依賴注入的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

本文將給大家詳細(xì)介紹關(guān)于Laravel依賴注入的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。

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

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

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

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

1.路由定義

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

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

這是一個(gè)資源型的路由,Laravel 會(huì)自動(dòng)生成增刪改查的路由入口。

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

路由方法解析

根據(jù)路由定義找到控制器和方法,執(zhí)行具體的方法在 dispatch 方法中實(shí)現(xiàn)。

(文件: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 方法,“顧名思義”是根據(jù)類的方法參數(shù)獲取依賴對(duì)象,然后再調(diào)用類的方法并把對(duì)象參數(shù)注入。

如果有多個(gè)依賴對(duì)象,也會(huì) foreach 依次解析出來作為參數(shù)注入。

獲取依賴對(duì)象示例的代碼:

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

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

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

2.獲取依賴對(duì)象的示例

從方法的參數(shù)中獲取了依賴對(duì)象的約束類型,就可以實(shí)例化這個(gè)依賴的對(duì)象。

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);
 }
}

根據(jù)類名從容器中獲取對(duì)象,這個(gè)綁定對(duì)象實(shí)例的過程在服務(wù)提供者中先定義和了。

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

3.關(guān)于 PHP 反射

舉個(gè)使用 ReflectionMethod 的例子。

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

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

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • PHP實(shí)現(xiàn)rar解壓讀取擴(kuò)展包小結(jié)

    PHP實(shí)現(xiàn)rar解壓讀取擴(kuò)展包小結(jié)

    今天重點(diǎn)給大家介紹PHP 擴(kuò)展就是針對(duì)于 rar 的壓縮包操作,不過,PHP 的 rar 擴(kuò)展僅能讀取和解壓 rar 格式的壓縮包,并不能進(jìn)行壓縮操作,關(guān)于 rar 的壓縮操作并沒有找到太多有用的資料,下面通過本文一起學(xué)習(xí)下PHP rar解壓讀取知識(shí)吧
    2021-06-06
  • 使用php測試硬盤寫入速度示例

    使用php測試硬盤寫入速度示例

    使用php寫入一個(gè)1GB大小的文件,檢查硬盤的寫速率,可能有一定誤差,一般電腦讀寫在20M/s,這個(gè)測試要執(zhí)行大概40-50s
    2014-01-01
  • laravel admin實(shí)現(xiàn)分類樹/模型樹的示例代碼

    laravel admin實(shí)現(xiàn)分類樹/模型樹的示例代碼

    這篇文章主要介紹了laravel admin實(shí)現(xiàn)分類樹/模型樹,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • php創(chuàng)建多級(jí)目錄完整封裝類操作方法

    php創(chuàng)建多級(jí)目錄完整封裝類操作方法

    下面小編就為大家?guī)硪黄猵hp創(chuàng)建多級(jí)目錄完整封裝類操作方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Laravel使用RabbitMQ的方法示例

    Laravel使用RabbitMQ的方法示例

    這篇文章主要介紹了Laravel使用RabbitMQ的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法

    Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法

    這篇文章主要介紹了Laravel使用scout集成elasticsearch做全文搜索的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • PHP解決高并發(fā)的優(yōu)化方案實(shí)例

    PHP解決高并發(fā)的優(yōu)化方案實(shí)例

    這篇文章主要介紹了PHP解決高并發(fā)的優(yōu)化方案實(shí)例,介紹的非常詳細(xì),對(duì)這塊不太明白的小伙伴可以跟隨小編一起來探討研究吧!
    2020-12-12
  • 初識(shí)PHP中的Swoole

    初識(shí)PHP中的Swoole

    Swoole是一種PHP高級(jí)Web開發(fā)框架,框架不是為了提升網(wǎng)站的性能,是為了提升網(wǎng)站的開發(fā)效率。最少的性能損耗,換取最大的開發(fā)效率
    2016-04-04
  • 程序員的表白神器“520”大聲喊出來

    程序員的表白神器“520”大聲喊出來

    程序員520也不忘表白,下面是一位程序員盆友寫的代碼來慶祝這個(gè)520節(jié)日,一起看看吧
    2016-05-05
  • PHP 使用redis簡單示例分享

    PHP 使用redis簡單示例分享

    這篇文章主要介紹了PHP 使用redis簡單示例分享,主要是給大家展示下,php使用redis的方法,有需要的小伙伴們參考下。
    2015-03-03

最新評(píng)論