国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Laravel 依賴注入源碼解析

Donne / 1937人閱讀

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

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

這里 $request 參數(shù)就使用了類型約束,Request 是類型約束的類型,它是一個類:IlluminateHttpRequest.

本文研究 Laravel 的依賴注入原理,為什么這樣定義不需要實例化就可以直接使用 Request 的方法呢?只是框架幫我們實例化并傳參了,我們看看這個過程。

1.路由定義

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

Route::resource("/role", "AdminRoleController");

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

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

路由方法解析

根據(jù)路由定義找到控制器和方法,這個過程在 dispatch 方法中實現(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 方法,“顧名思義”這個方法的作用是從類的方法中獲取依賴對象:

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

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

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

2.獲取依賴對象的示例

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

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ù)類名從容器中獲取對象,這個綁定對象實例的過程在服務(wù)提供者中先定義和了。

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

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

舉個使用 ReflectionMethod 的例子。

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

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

可以得出這個方法的參數(shù)列表,參數(shù)的約束類型,如 typeHint,IlluminateHttpRequest.

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

(原文地址:https://blog.tanteng.me/2018/...)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28121.html

相關(guān)文章

  • 深入剖析 Laravel 服務(wù)容器

    摘要:劃下重點,服務(wù)容器是用于管理類的依賴和執(zhí)行依賴注入的工具。類的實例化及其依賴的注入,完全由服務(wù)容器自動的去完成。 本文首發(fā)于 深入剖析 Laravel 服務(wù)容器,轉(zhuǎn)載請注明出處。喜歡的朋友不要吝嗇你們的贊同,謝謝。 之前在 深度挖掘 Laravel 生命周期 一文中,我們有去探究 Laravel 究竟是如何接收 HTTP 請求,又是如何生成響應(yīng)并最終呈現(xiàn)給用戶的工作原理。 本章將帶領(lǐng)大...

    abson 評論0 收藏0
  • Laravel修煉:服務(wù)容器綁定與解析

    摘要:用匿名函數(shù)的好處在于,這個服務(wù)綁定到容器以后,并不會立即產(chǎn)生服務(wù)最終的對象,只有在這個服務(wù)解析的時候,匿名函數(shù)才會執(zhí)行,此時才會產(chǎn)生這個服務(wù)對應(yīng)的服務(wù)實例。 前言 ? 老實說,第一次老大讓我看laravel框架手冊的那天早上,我是很絕望的,因為真的沒接觸過,對我這種渣渣來說,laravel的入門門檻確實有點高了,但還是得硬著頭皮看下去(雖然到現(xiàn)在我還有很多沒看懂,也沒用過)。? 后面慢...

    The question 評論0 收藏0
  • Laravel核心——Ioc服務(wù)容器源碼解析(服務(wù)器解析

    摘要:而函數(shù)作用是加載延遲服務(wù),與容器解析關(guān)系不大,我們放在以后再說。在構(gòu)造之前,服務(wù)容器會先把放入中,繼而再去解析。利用服務(wù)容器解析依賴的參數(shù)。 make解析 首先歡迎關(guān)注我的博客: www.leoyang90.cn 服務(wù)容器對對象的自動解析是服務(wù)容器的核心功能,make 函數(shù)、build 函數(shù)是實例化對象重要的核心,先大致看一下代碼: public function make($abst...

    hearaway 評論0 收藏0
  • 詳解 Laravel 中的依賴注入和 IoC

    摘要:依賴注入依賴注入一詞是由提出的術(shù)語,它是將組件注入到應(yīng)用程序中的一種行為。就像說的依賴注入是敏捷架構(gòu)中關(guān)鍵元素。類依賴于,所以我們的代碼可能是這樣的創(chuàng)建一個這是一種經(jīng)典的方法,讓我們從使用構(gòu)造函數(shù)注入開始。 showImg(https://segmentfault.com/img/remote/1460000018806800); 文章轉(zhuǎn)自:https://learnku.com/la...

    haitiancoder 評論0 收藏0
  • Laravel思維導(dǎo)圖之Laravel核心概念

    摘要:的核心概念包括服務(wù)容器服務(wù)提供者門面契約。所有服務(wù)提供者都需要繼承類。可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。同樣會整理成思維導(dǎo)圖的形式以方便記憶與回顧。 showImg(https://segmentfault.com/img/remote/1460000010771201); Laravel 的核心概念包括:服務(wù)容器、服務(wù)提供者、門面(Fac...

    wthee 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<