Cloud Intelligence (Beijing) Technology Co., Ltd.
1. IoC の概念の紹介
制御反転 (IOC) モード(DI:DependencyInjection とも呼ばれます) は、Inversion ofControl、制御の反転です。 Java 開発において、IoC とは、クラス内でクラスを制御するのではなく、設計したクラスを制御のためにシステムに引き渡すことを意味します。これを制御の反転といいます。
IoC (Inversion of Control) は、単なるプログラミングのアイデアではなく、近年登場したアイデアです。主な目的は、コンポーネント間の相互依存関係を調整しながら、コンポーネントの移植性を大幅に向上させ、コンポーネントを再利用する機会を増やすことです。従来の実装では、プログラムの内部コードがプログラム間の関係を制御します。 2 つのキー セット間の関係の組み合わせを実装するために、多くの場合、 new キーワードが使用されます。この実装方法では、コンポーネント間の結合が発生します (優れた設計では、コードの再利用を実現するだけでなく、コンポーネント間の関係を分離することも必要です)。 IoC はこの問題をうまく解決し、プログラム内から外部コンテナまでのコンポーネント間の関係を管理します。つまり、コンテナは実行時にコンポーネント間の特定の依存関係をコンポーネントに動的に注入します。プログラム間の関係を制御する実装は外部コンテナーに任せられます。それはハリウッドでよく言われる「電話しないでください、私たちが電話します」という原則です。
では、Laravel フレームワークでは Ioc モードはどのように実装されているのでしょうか?
2. Laravel フレームワークでの Ioc モードの実装
1. リクエスト実装のフローチャート
リクエスト処理内図からわかるように、start.php と Application.php という 2 つの重要なファイルがあります。そのうち、グローバル変数 $app = new IlluminateFoundationApplication が start.php ファイルに導入されていることに注意してください。注入されたすべての依存関係を解決するため、関係の「ハウスキーパー」はアプリケーションで使用されるツール クラスを事前に保存し、使用時にいつでも取得できます。
2. 配列を使ったオブジェクトの管理
lluminateFoundationApplicationクラスはlaravelのコンテナContainerとPHPの標準インターフェースArrayAccessを継承することでオブジェクトの配列管理を実現します。
PHP の標準インターフェイス ArrayAccess には 4 つの属性が含まれています:
ArrayAccess の定義は次のとおりです:
interface ArrayAccess
boolean offsetExists($index)
mixed offsetGet($index)
void offsetSet($index, $newvalue)
void offsetUnset($index)
Application クラスから継承したコンテナ クラスは、これら 4 つの抽象メソッドを書き換えて、アプリケーションで使用される関数を実装します。 Container クラスの 2 つの属性 $bindings と $instances は、実際のアプリケーションで使用されるツール クラスのインスタンスを格納するために使用されます。このようにして、$app['ツール クラスのエイリアス'] または「ツール クラスのエイリアス::メソッド名のエイリアス」を通じて、実際のツール クラス インスタンス内のメソッドを呼び出すことができます。
たとえば、ルーティングで一般的に使用されるメソッド: Route::post('url','controller@method');
サービスを $app にグローバルに登録します変数のうち、laravel は app/config/app.php 設定を読み取り、
'providers' => array(
'IlluminateFoundationProvidersArtisanServiceProvider',
' を変換することで実装されます。 IlluminateAuthAuthServiceProvider',
'IlluminateCacheCacheServiceProvider',
'IlluminateSessionCommandsServiceProvider',
'IlluminateFoundationProvider ersConsoleSupportServiceProvider',
' IlluminateRoutingControllerServiceProvider',
'IlluminateCookieCookieServiceProvider',
'IlluminateDatabaseDatabaseServiceProvider',
'IlluminateEncryptionEncryptionServiceProvider',
'IlluminateFilesystemFilesystem ServiceProvider',
プロバイダー'、
'IlluminateHtmlHtmlServiceProvider',
'IlluminateLogLogServiceProvider',
'IlluminateMailMailServiceProvider',
'IlluminateDatabaseMigrationServiceProvider',
ginationPaginationServiceProvider',
'IlluminateQueueQueueServiceProvider',
'IlluminateRedisRedisServiceProvider',
'IlluminateRemoteRemoteServiceProvider',
'IlluminateAuthRemind ersReminderServiceProvider',
'IlluminateDatabaseSeedServiceProvider',
'IlluminateSessionSessionServiceProvider',
'IlluminateTranslationTranslationServiceProvider',
'IlluminateVal idationValidationServiceProvider',
'IlluminateViewViewServiceProvider',
'IlluminateWorkbenchWorkbenchServiceProvider',
),
IlluminateFoundationstart.php の
$providers = $config['providers'] によるファイル ;
$app->getProviderRepository()->load($app,$providers);
$app に挿入します。同時に、
$aliases = $config['aliases'];
AliasLoader::getInstance($aliases)->register();
Inこうすることで、エイリアスを使用して、実行したいサービスにアクセスできます。
制御の反転とエイリアスの利点を活用します:
Laravel では、同じ呼び出しメソッドを制御の反転によって解決できますが、異なる実装方法を採用することができます。 。このようにして、ビジネス ロジックのコードを変更せずに、問題を解決するさまざまな方法を変更できます。
たとえば、Laravel で使用されるキャッシュの場合、ビジネス ロジック コードで Cache::set() を使用してキャッシュ キャッシュを設定するだけです。ただし、キャッシュが作成される特定の方法を気にする必要はありません。 $app[‘cache’] は Redis インスタンスまたは memcache インスタンスのいずれかを保存できるため、これは構成ファイルによって決定できます。
従来のキャッシュ方法を使用すると、Redis::set() または Memcache::set() になるため、別のキャッシュ保存方法に変更したい場合は変更する必要があります。ビジネスロジックコードを完成させることができます。