laravel依存性注入の分析

laravelコンテナが噴射制御と依存性逆転を含み、それはのような直接的な撮影を行うために必要なときに、使用することができる、優れたオブジェクト最初のバインドを使用することです。

次のように通常、私たちは呼んでいます。

設定=、コンテナ$ $>メイク(「設定」);
$ =新しい接続接続(の$ this - >設定);

より良い理解、この利点は、直接法の新しいインスタンスは、さらに、伝統的な価値観が変化欠けていません多くは、このインスタンスを共有することができます。

しかし、この依存性は、注射を行うには何も持って、実際の依存性注入の方法は、任意のパラメータを渡すために必要とされていない、あなただけはメソッドのパラメータの型を指定する必要があり、コードの参照関係自動注入に依存しています。

次のようにこの機能は、などlaravelコントローラ、仕事に反映することができます。

クラスTestControllerコントローラーを拡張
{
パブリック関数anyConsole(要求$要求、認証$入力)
{
// TODO
}
}


私たちは、彼が自動依存性注入である方法を見て:

、ミドルウェアパイプラインコールの層を介してカーネルカーネルコールindex.phpを、ルータ、によって呼び出されるパイプの層を通ります。最終的な位置決め

/ルーティング/ Route.php第124行を照明します。

パブリック関数の実行(要求$リクエスト)
{
の$ this - >コンテナ=の$ this - >コンテナ:?新しいコンテナ。
{しようと
{(!IS_STRING(の$ this - >アクション[ '用途']))場合
runCallable($リクエスト)>の$ this -を返します。
}

IF(の$ this - > customDispatcherIsBound()){
の$ this - > runWithCustomDispatcher($要求)を返します。
}

の$ this - > runController($リクエスト)を返します。
}キャッチ(HttpResponseException $ E){
リターン$ E->てgetResponse();
}
}


の$ this - >アクションを分析すると、(このようなライン形式として:\アプリケーション\のHttp \コントローラ\データセンターを\ RealTimeController @ anyConsole)[ '使用']を文字列ならば、ます$ this-> customDispatcherIsBoundは、ユーザ定義の結束ルートかどうかを決定します。その後の$ this - > runController($リクエスト)にジャンプします。

保護された関数runController(要求$要求)
{
リスト($クラス、$法)=爆発( '@'の$ this - >アクション[ '用途'])。

$パラメータ=の$ this - > resolveClassMethodDependencies(
の$ this - > parametersWithoutNulls()、$クラス、$法
);

もし{(method_exists($インスタンス=の$ this - >、コンテナ>作る($クラス)、$方式)!)
新しいNotFoundHttpException投げます。
}

([$インスタンス、メソッド、$]、パラメーターを$)を返すcall_user_func_array;
}

の$ this - > resolveClassMethodDependencies知っている名前を表示するには、この方法では、我々が探している方法です。の$ this - > parametersWithoutNulls()は、それぞれ、そのような線としてフィルタNULL文字、$クラス、$メソッドです:コントローラ\ \アプリケーション\のHttp \データセンター\ RealTimeController とanyConsole。

保護された関数resolveClassMethodDependencies(配列$パラメータ、$例えば、$法)
{
(method_exists($インスタンス、$法)!)なら、{
$パラメータを返します。
}

の$ this -リターン> resolveMethodDependencies(
$パラメータ、新しい新ReflectionMethod($インスタンス、$法)
);
}

オブジェクトによって反射された新しい新ReflectionMethod($インスタンス、$メソッドは)クラスメソッドを取得することで、ドキュメントを参照します。http://www.phpを.NET /マニュアル/ ZH / class.reflectionmethod.php

/ルーティング/ RouteDependencyResolverTrait.phpライン54を照明するために、次のジャンプ。

パブリック関数resolveMethodDependencies(配列$パラメータ、ReflectionFunctionAbstract $リフレクタ)
{
$ originalParameters = $パラメータ。

foreachの($ reflector-> getParameters()$キー=> $パラメータとして){
$インスタンス=の$ this - > transformDependency(
$パラメータ、$パラメータ、$ originalParameters
)。

(!IS_NULL($インスタンス)){場合
の$ this - > spliceIntoParameters($パラメータ、$キー、$インスタンス)。
}
}

;パラメータ$リターン
}

次に反射によってパラメータクラスのクラスメソッドの配列を得るために、トラバースの$ this - > transformDependencyメソッドに送信されます。呼び出されたインスタンスは以下の$ this - >を取得する場合spliceIntoParametersは、このパラメータをオフにします。

transformDependency機能保護(ReflectionParameterパラメータ$、$パラメータ、originalParameters $)
{
$ = $パラメータクラス>はgetClass();
IF(!$クラス&&ます$ this-> alreadyInParameters($クラス- >名前、$パラメータ)){
リターンthis- $>、コンテナ>($クラス- > name)を作る;
}
}

最後にコンテナの影を参照してください、そう最終的にオブジェクトによって取り出されたか、メソッドコンテナを作成しています。さて、このパラメータに構築され、その後、runControllerコールバックメソッドcall_user_func_arrayになってしまいます。

要約:
1.原理依存注入方法では、次いで、パラメータタイプを取得するため、容器構造の使用の良い例として反射型の使用です。その後、コールバック関数から呼び出しを使用。
2. Fillオブジェクトのコンストラクタは、パラメータを持っていません。それ以外の場合はエラーになります。1つの引数の欠落
依存性の注入はとても良い、しかし3を、それが達成できない新しい注入とルータクラス転送、または直接的な方法で再生する必要があります。これは、なぜコントローラのみ、この機能を使用するために、ジョブ・クラスです。

おすすめ

転載: www.cnblogs.com/starluke/p/11791478.html