ホームページ >バックエンド開発 >PHPチュートリアル >ソースコード分析とLaravel依存関係注入手順の詳細な説明

ソースコード分析とLaravel依存関係注入手順の詳細な説明

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-19 14:22:411591ブラウズ

今回は、Laravelのソースコード分析依存性注入の手順を詳しく説明します。Laravelのソースコード分析依存性注入の注意事項

は何ですか。以下は実際的なケースです。見てみましょう。

はじめに

ご存知のとおり、近年、その優雅さで知られるフレームワークが無数に存在し、国内の PHPer の間で使用され始めています。しかし、Larave には明らかな欠点があります。 : it ドキュメントの内容は悲惨です。

この記事では、Laravel の依存関係注入について詳しく説明し、参考と学習のために共有します。以下では多くを説明しません。詳細な紹介を見てみましょう。

Laravel のコントローラーのコンストラクターまたはメンバー メソッドでは、次のような型制約

を介して依存関係注入を使用できます。

public function store(Request $request)
{
 //TODO
}
ここで $request パラメーターは型制約を使用し、Request はクラス IlluminateHttpRequest であることを示します。パラメータはこのクラスまたはサブクラスでなければなりません。

この記事では、Laravel のソースコードを分析して、メソッドでインスタンスを渡さずに Request を直接使用できる理由を確認します。フレームワークが自動的にインスタンスを作成し、パラメータを渡してくれるだけです。

1. ルート定義

ルート定義ファイルには、このようなルートが定義されています:

Route::resource('/role', 'Admin\RoleController');
これは、Laravelが追加、削除用のルートエントリを自動的に生成します。 、変更およびクエリ。

この記事の冒頭のストアメソッドはコントローラーメソッドです。ルートに定義されているアクションは次の図で確認できます: AppHttpControllersAdminRoleController@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));
}
最初のresolveClassMethodDependencyメソッドは、「名前が示すように」クラスのメソッドパラメータに従って依存オブジェクトを取得することです。次に、クラスメソッドを呼び出し、オブジェクトのパラメータインジェクションを配置します。

複数の依存オブジェクトがある場合、それらは foreach によって順番に解析され、パラメーターとして挿入されます。

依存オブジェクトの例のコードを取得します:

protected function resolveClassMethodDependencies(array $parameters, $instance, $method)
{
 if (! method_exists($instance, $method)) {
  return $parameters;
 }
 
 return $this->resolveMethodDependencies(
  $parameters, new ReflectionMethod($instance, $method)
 );
}
ここでの重要な点は、クラスのメソッド パラメータ リストを取得し、パラメータの型制約を知ることができる RelectionMethod メソッドの使用に注意してください。名前など

ここでの$instanceパラメータはRoleControllerコントローラクラス、$methodパラメータはメソッド名storeです。

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)
 {
 }
}
図に示すように、新しい ReflectionMethod(Demo::class, 'store') の内容を出力します。

このメソッドのパラメーター リストとパラメーターの制約タイプを取得できます。 typeHint、IlluminateHttpRequest.

クラスによると、最初にサービスプロバイダーを通じてインスタンスをバインドすることで、名前をコンテナーから取得できます。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨書籍:

phpのデータ構造と逐次リンクリスト、リンク線形リストの使用方法の詳細な説明

php統計的なバイナリ1を実装するためのアルゴリズムステップの詳細な説明

🎜

以上がソースコード分析とLaravel依存関係注入手順の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。