Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


basic-library:league-container:3.3

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
basic-library:league-container:3.3 [2020/04/19 11:42]
y2sunlight [テストプログラム]
basic-library:league-container:3.3 [2020/04/19 22:14] (現在)
y2sunlight
行 1: 行 1:
-> TODO: 編集中 
- 
------ 
- 
 ====== DIコンテナー - League/Container ====== ====== DIコンテナー - League/Container ======
 Version 3.3 ([[https://github.com/thephpleague/container/blob/master/LICENSE.md|MIT License]]) Version 3.3 ([[https://github.com/thephpleague/container/blob/master/LICENSE.md|MIT License]])
行 36: 行 32:
 =====  League/Containerについて ===== =====  League/Containerについて =====
  
-DIコンテナの主な目的はコントローラへの依存性の注入(DI)にあると思います。それはビジネスロジックであるサービスとコントローラやビューとの結合性を如何に疎にするかによって開発効率、保守性やテスト容易性が決まるからに他なりません。しかし「ちょっとした機能のプログラムをPHPでサクサクと実装したい」のが目的のApricotにDIコンテナが果たして必要なのでしょうか。迷いましたが結果的には、ORMやリクエストルーターと同じくシンプルで軽量なものを選定して追加することにしました。現在ではDIコンテナはもはやソフトウェア開発にとって当たり前の部品なのかもしれません。+DIコンテナの主な目的はコントローラへの依存性の注入(DI)にあると思います。それはビジネスロジックであるサービスとコントローラやビューとの結合性を如何に疎にするかによって開発効率、保守性やテスト容易性が決まるからに他なりません。しかし「ちょっとした機能のプログラムをPHPでサクサクと実装したい」のが目的のApricotにDIコンテナが果たして必要なのでしょうか。迷いましたが結果的には、ORMやリクエストルーターと同じくシンプルで軽量なものを選定して追加することにしました。現在ではDIコンテナはもはやソフトウェア開発にとって当たり前の部品なのかもしれません。
  
 DIコンテナにはいくつかの候補があがりました。シンプルで軽量という時点で多機能で秀作なDIコンテナである[[http://php-di.org/|PHP-DI]]は除外されましたが、場合によっては選択してもよかったと思っています。そして次の2つが候補に残りました: DIコンテナにはいくつかの候補があがりました。シンプルで軽量という時点で多機能で秀作なDIコンテナである[[http://php-di.org/|PHP-DI]]は除外されましたが、場合によっては選択してもよかったと思っています。そして次の2つが候補に残りました:
行 83: 行 79:
 ===== テストプログラム ===== ===== テストプログラム =====
  
-パッケージのテストフォルダ(test\league-container\)に、以下のテスト用のコードを作成します。この例は[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:league-container:3.3|League/Containerのマニュアル]]に記載されているのを簡素した例題です。+以下の例題は、コンストラクタ・インェクションを3つ方法で行ったものです。最初はDIコンテナーを使用しない場合、2つ目はDIコンテナーを使用した場合、最後にAuto Wiringを使ったものです。テスト用のコードはテストフォルダ(test\league-container\)に、作成します。この例は League/Containerのマニュアル に記載されている [[https://container.thephpleague.com/3.x/auto-wiring|Auto Wiring例題]] を簡素したものです。
  
   * Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ   * Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ
行 89: 行 85:
   * index2.php --- DIコンテナ― によるコンストラクター・インジェクションの例   * index2.php --- DIコンテナ― によるコンストラクター・インジェクションの例
   * index3.php --- Auto Wiring によるコンストラクター・インジェクションの例   * index3.php --- Auto Wiring によるコンストラクター・インジェクションの例
-  * index4.php --- Auto Wiring だがDIコンテナーをキャッシュしている例+  * index4.php --- Auto Wiring だがコンテナーをキャッシュしている例
  
 <code php Foo.php> <code php Foo.php>
行 134: 行 130:
 \\ \\
  
-==== 【テスト1】手動によるコンストラクター・インジェクション ====+==== 【テスト1】DIコンテナを使用しない場合 ====
  
-サービス及びコントローラをDIコンテナーを使わずに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。+DIコンテナーを使わずに、サービスをコントローラに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。
  
 <code php index1.php> <code php index1.php>
行 145: 行 141:
 spl_autoload_register(function ($class) spl_autoload_register(function ($class)
 { {
-    require __DIR__.'/controller.php';+    require __DIR__.'/Foo.php';
 }); });
  
行 151: 行 147:
 // 手動によるコンストラクター・インジェクション // 手動によるコンストラクター・インジェクション
 //------------------------------------- //-------------------------------------
-$bam = new Acme\Bam; 
 $baz = new Acme\Baz; $baz = new Acme\Baz;
-$bar = new Acme\Bar($bam);+$bar = new Acme\Bar;
 $foo = new Acme\Foo($bar, $baz); $foo = new Acme\Foo($bar, $baz);
  
行 159: 行 154:
 var_dump($foo->bar instanceof Acme\Bar);      // true var_dump($foo->bar instanceof Acme\Bar);      // true
 var_dump($foo->baz instanceof Acme\Baz);      // true var_dump($foo->baz instanceof Acme\Baz);      // true
-var_dump($foo->bar->bam instanceof Acme\Bam); // true 
 </code> </code>
  
 === 結果 === === 結果 ===
 <code> <code>
 +D:\usr\ws2019\apricot\test\league-container\index1.php:17:boolean true
 +D:\usr\ws2019\apricot\test\league-container\index1.php:18:boolean true
 D:\usr\ws2019\apricot\test\league-container\index1.php:19:boolean true D:\usr\ws2019\apricot\test\league-container\index1.php:19:boolean true
-D:\usr\ws2019\apricot\test\league-container\index1.php:20:boolean true 
-D:\usr\ws2019\apricot\test\league-container\index1.php:21:boolean true 
-D:\usr\ws2019\apricot\test\league-container\index1.php:22:boolean true 
 </code> </code>
  
 \\ \\
  
-==== テスト2 ==== +==== テスト2】DIコンテナを使用する場合 ==== 
-> TODO:+ 
 +DIコンテナ― によるコンストラクター・インジェクションの例です。依存関係をクラスコンストラクターに渡すことは、依存性注入の最も簡単な方法です。League/Container ではコンストラクター・インジェクションの他に、セッター・インジェクションとクラスファクトリーによる依存性注入の方法もサポートしています。
  
 <code php index2.php> <code php index2.php>
行 182: 行 176:
 spl_autoload_register(function ($class) spl_autoload_register(function ($class)
 { {
-    require __DIR__.'/controller.php';+    require __DIR__.'/Foo.php';
 }); });
  
 //------------------------------------- //-------------------------------------
-// Auto Wiring による+// DIコンテナによるコンストラクター・インジェクション
 //------------------------------------- //-------------------------------------
 $container = new League\Container\Container; $container = new League\Container\Container;
  
-// リフレクションコンテナーをデリゲートとして登録してAuto Wiringを有効にする +$container 
-// ()既定では、リフレクションコンテナーは、要求するたびに要求を解決します。 +    ->add(Acme\Foo::class
-$container->delegate+    ->addArgument(Acme\Bar::class) 
-    new League\Container\ReflectionContainer +    ->addArgument(Acme\Baz::class) 
-);+
 +$container->add(Acme\Bar::class); 
 +$container->add(Acme\Baz::class);
  
 $foo = $container->get(Acme\Foo::class); $foo = $container->get(Acme\Foo::class);
行 201: 行 197:
 var_dump($foo->bar instanceof Acme\Bar);      // true var_dump($foo->bar instanceof Acme\Bar);      // true
 var_dump($foo->baz instanceof Acme\Baz);      // true var_dump($foo->baz instanceof Acme\Baz);      // true
-var_dump($foo->bar->bam instanceof Acme\Bam); // true 
 </code> </code>
  
 === 結果 === === 結果 ===
 <code> <code>
-D:\usr\ws2019\apricot\test\league-container\index2.php:24:boolean true 
 D:\usr\ws2019\apricot\test\league-container\index2.php:25:boolean true D:\usr\ws2019\apricot\test\league-container\index2.php:25:boolean true
 D:\usr\ws2019\apricot\test\league-container\index2.php:26:boolean true D:\usr\ws2019\apricot\test\league-container\index2.php:26:boolean true
行 214: 行 208:
 \\ \\
  
-==== テスト3 ==== +==== テスト3】Auto Wiringを使用する場合 ==== 
-TODO:+League/Containerは **Auto Wiring** 機能をサポートします。これは、コンストラクター引数の型ヒントを調べることにより、オブジェクトとそのすべての依存関係を再帰的に自動的に解決する機能です。但し、注入できるのはオブジェクト型の変数だけです。 
 + 
 +>Auto Wiring はデフォルトで無効になっているので、有効にするにはコンテナデリゲートとして ''ReflectionContainer'' を登録しなけらばなりません。
  
 <code php index3.php> <code php index3.php>
行 224: 行 220:
 spl_autoload_register(function ($class) spl_autoload_register(function ($class)
 { {
-    require __DIR__.'/controller.php';+    require __DIR__.'/Foo.php';
 }); });
  
 //------------------------------------- //-------------------------------------
-// Auto Wiring による+// Auto Wiring によるコンストラクター・インジェクション
 //------------------------------------- //-------------------------------------
 $container = new League\Container\Container; $container = new League\Container\Container;
  
-// リフレクョンコンテナーのキャッシュを有効にするに、以下のようにします+// ReflectionContainerをデゲートとして登録してAuto Wiringを有効にする 
 +// (注)デォルトでは、ReflectionContainerは、要求するたびにそれを解決します。 
 +$container->delegate( 
 +    new League\Container\ReflectionContainer 
 +); 
 + 
 +$foo = $container->get(Acme\Foo::class); 
 + 
 +var_dump($foo instanceof Acme\Foo);           // true 
 +var_dump($foo->bar instanceof Acme\Bar);      // true 
 +var_dump($foo->baz instanceof Acme\Baz);      // true 
 +</code> 
 + 
 +=== 結果 === 
 +<code> 
 +D:\usr\ws2019\apricot\test\league-container\index3.php:23:boolean true 
 +D:\usr\ws2019\apricot\test\league-container\index3.php:24:boolean true 
 +D:\usr\ws2019\apricot\test\league-container\index3.php:25:boolean true 
 +</code> 
 + 
 +\\ 
 + 
 +==== 【テスト4】Auto Wiringを使用する場合(キャッュ有効) ==== 
 +デフォルトでは ReflectionContainer は、要求の度にそれを解決しようとします。ReflectionContainer でキャッシュ機能を有効にするには以下のようにcacheResolutions()を使用します。 
 + 
 +<code php index4.php> 
 +<?php declare(strict_types=1); 
 +require __DIR__.'/../../vendor/autoload.php'; 
 + 
 +// ComposerのAutoloadの代替 
 +spl_autoload_register(function ($class) 
 +
 +    require __DIR__.'/Foo.php'; 
 +}); 
 + 
 +//------------------------------------- 
 +// Auto Wiring によるコンストラクタ・インジェクション 
 +//------------------------------------- 
 +$container = new League\Container\Container; 
 + 
 +// ReflectionContainerのキャッシュを有効にするに、以下のようにします
 $container->delegate( $container->delegate(
     (new League\Container\ReflectionContainer)->cacheResolutions()     (new League\Container\ReflectionContainer)->cacheResolutions()
行 245: 行 281:
 === 結果 === === 結果 ===
 <code> <code>
-D:\usr\ws2019\apricot\test\league-container\index3.php:24:boolean true +D:\usr\ws2019\apricot\test\league-container\index4.php:23:boolean true</code>
-</code>+
  
 \\ \\
  
basic-library/league-container/3.3.1587264144.txt.gz · 最終更新: 2020/04/19 11:42 by y2sunlight