このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
basic-library:league-container:3.3 [2020/04/19 12:00] y2sunlight [【テスト1】手動によるコンストラクター・インジェクション] |
basic-library:league-container:3.3 [2020/04/19 22:14] y2sunlight |
||
---|---|---|---|
行 1: | 行 1: | ||
- | > TODO: | ||
- | |||
- | ----- | ||
- | |||
====== DIコンテナー - League/ | ====== DIコンテナー - League/ | ||
Version 3.3 ([[https:// | Version 3.3 ([[https:// | ||
行 36: | 行 32: | ||
===== League/ | ===== League/ | ||
- | DIコンテナの主な目的はコントローラへの依存性の注入(DI)にあると思います。それはビジネスロジックであるサービスとコントローラやビューとの結合性を如何に疎にするかによって開発効率、保守性やテスト容易性が決まるからに他なりません。しかし「ちょっとした機能のプログラムをPHPでサクサクと実装したい」のが目的のApricotにDIコンテナが果たして必要なのでしょうか。迷いましたが結果的には、ORMやリクエストルーターと同じくシンプルで軽量なものを選定して追加することにしました。現在ではDIコンテナはもはやソフトウェア開発にとって当たり前の部品なのかもしれません。 | + | DIコンテナの主な目的はコントローラへの依存性の注入(DI)にあると思います。それはビジネスロジックであるサービスと、コントローラやビューとの結合性を如何に疎にするかによって開発効率、保守性やテスト容易性が決まるからに他なりません。しかし「ちょっとした機能のプログラムをPHPでサクサクと実装したい」のが目的のApricotにDIコンテナが果たして必要なのでしょうか。迷いましたが結果的には、ORMやリクエストルーターと同じくシンプルで軽量なものを選定して追加することにしました。現在ではDIコンテナはもはやソフトウェア開発にとって当たり前の部品なのかもしれません。 |
DIコンテナにはいくつかの候補があがりました。シンプルで軽量という時点で多機能で秀作なDIコンテナである[[http:// | DIコンテナにはいくつかの候補があがりました。シンプルで軽量という時点で多機能で秀作なDIコンテナである[[http:// | ||
行 83: | 行 79: | ||
===== テストプログラム ===== | ===== テストプログラム ===== | ||
- | パッケージのテストフォルダ(test\league-container\)に、以下のテスト用のコードを作成します。この例は League/ | + | 以下の例題は、コンストラクター・インジェクションを3つの方法で行ったものです。最初はDIコンテナーを使用しない場合、2つ目はDIコンテナーを使用した場合、最後にAuto Wiringを使ったものです。テスト用のコードはテストフォルダ(test\league-container\)に、作成します。この例は League/ |
* Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ | * Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ | ||
行 134: | 行 130: | ||
\\ | \\ | ||
- | ==== 【テスト1】手動によるコンストラクター・インジェクション | + | ==== 【テスト1】DIコンテナを使用しない場合 |
DIコンテナーを使わずに、サービスをコントローラに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。 | DIコンテナーを使わずに、サービスをコントローラに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。 | ||
行 169: | 行 165: | ||
\\ | \\ | ||
- | ==== テスト3 ==== | + | ==== 【テスト2】DIコンテナを使用する場合 |
- | > TODO: | + | |
+ | DIコンテナ― によるコンストラクター・インジェクションの例です。依存関係をクラスコンストラクターに渡すことは、依存性注入の最も簡単な方法です。League/ | ||
+ | |||
+ | <code php index2.php> | ||
+ | <?php declare(strict_types=1); | ||
+ | require __DIR__.'/ | ||
+ | |||
+ | // ComposerのAutoloadの代替 | ||
+ | spl_autoload_register(function ($class) | ||
+ | { | ||
+ | require __DIR__.'/ | ||
+ | }); | ||
+ | |||
+ | // | ||
+ | // DIコンテナによるコンストラクター・インジェクション | ||
+ | // | ||
+ | $container = new League\Container\Container; | ||
+ | |||
+ | $container | ||
+ | -> | ||
+ | -> | ||
+ | -> | ||
+ | ; | ||
+ | $container-> | ||
+ | $container-> | ||
+ | |||
+ | $foo = $container-> | ||
+ | |||
+ | var_dump($foo instanceof Acme\Foo); | ||
+ | var_dump($foo-> | ||
+ | var_dump($foo-> | ||
+ | </ | ||
+ | |||
+ | === 結果 === | ||
+ | < | ||
+ | D: | ||
+ | D: | ||
+ | D: | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== 【テスト3】Auto Wiringを使用する場合 ==== | ||
+ | League/ | ||
+ | |||
+ | >Auto Wiring はデフォルトで無効になっているので、有効にするにはコンテナデリゲートとして '' | ||
<code php index3.php> | <code php index3.php> | ||
行 183: | 行 224: | ||
// | // | ||
- | // Auto Wiring による | + | // Auto Wiring によるコンストラクター・インジェクション |
// | // | ||
$container = new League\Container\Container; | $container = new League\Container\Container; | ||
- | // リフレクションコンテナーをデリゲートとして登録してAuto Wiringを有効にする | + | // ReflectionContainerをデリゲートとして登録してAuto Wiringを有効にする |
- | // (注)既定では、リフレクションコンテナーは、要求するたびに要求を解決します。 | + | // (注)デフォルトでは、ReflectionContainerは、要求するたびにそれを解決します。 |
$container-> | $container-> | ||
new League\Container\ReflectionContainer | new League\Container\ReflectionContainer | ||
行 209: | 行 250: | ||
\\ | \\ | ||
- | ==== テスト4 ==== | + | ==== 【テスト4】Auto Wiringを使用する場合(キャッシュ有効) |
- | > TODO: | + | デフォルトでは ReflectionContainer は、要求の度にそれを解決しようとします。ReflectionContainer でキャッシュ機能を有効にするには以下のようにcacheResolutions()を使用します。 |
<code php index4.php> | <code php index4.php> | ||
行 223: | 行 264: | ||
// | // | ||
- | // Auto Wiring による | + | // Auto Wiring によるコンストラクター・インジェクション |
// | // | ||
$container = new League\Container\Container; | $container = new League\Container\Container; | ||
- | // リフレクションコンテナーのキャッシュを有効にするに、以下のようにします | + | // ReflectionContainerのキャッシュを有効にするに、以下のようにします |
$container-> | $container-> | ||
(new League\Container\ReflectionContainer)-> | (new League\Container\ReflectionContainer)-> |