Ground Sunlight

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

ユーザ用ツール

サイト用ツール


basic-library:league-container:3.3

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン 両方とも次のリビジョン
basic-library:league-container:3.3 [2020/04/19 11:37]
y2sunlight
basic-library:league-container:3.3 [2020/04/19 16:00]
y2sunlight
行 83: 行 83:
 ===== テストプログラム ===== ===== テストプログラム =====
  
-パッケージのテストフォルダ(test\league-container\)に、以下のテスト用のコードを作成します。この例は[[http://www.y2sunlight.com/ground/doku.php?id=basic-library:league-container:3.3|League/Containerのマニュアル]]に記載されているものと同等です。+パッケージのテストフォルダ(test\league-container\)に、以下のテスト用のコードを作成します。この例は League/Containerのマニュアル に記載されている [[https://container.thephpleague.com/3.x/auto-wiring|Auto Wiringの例題]] を簡素化したものです。
  
-  * Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ\\ (さらにBarサービスはBamをコンストラクタ引数に持っている)+  * Foo.php --- 2つのサービス(BarとBza)を持つFooコントローラ
   * index1.php --- 手動によるコンストラクター・インジェクションの例   * index1.php --- 手動によるコンストラクター・インジェクションの例
-  * index2.php --- Auto Wiring によるコンストラクター・インジェクションの例 +  * index2.php --- DIコンテナ― によるコンストラクター・インジェクションの例 
-  * index3.php --- Auto Wiring だがDIコンテナーをキャッシュしている例+  * index3.php --- Auto Wiring によるコンストラクター・インジェクションの例 
 +  * index4.php --- Auto Wiring だがコンテナーをキャッシュしている例
  
 <code php Foo.php> <code php Foo.php>
行 122: 行 123:
 class Bar class Bar
 { {
-    /** +    // ..
-     * @var \Acme\Bam +
-     */ +
-    public $bam; +
- +
-    /** +
-     * Construct. +
-     * +
-     * @param \Acme\Bam $bam +
-     */ +
-    public function __construct(Bam $bam) +
-    { +
-        $this->bam = $bam; +
-    }+
 } }
  
 class Baz class Baz
-{ 
-    // .. 
-} 
- 
-class Bam 
 { {
     // ..     // ..
行 153: 行 136:
 ==== 【テスト1】手動によるコンストラクター・インジェクション ==== ==== 【テスト1】手動によるコンストラクター・インジェクション ====
  
-サービス及びコントローラをDIコンテナーを使わずに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。+DIコンテナーを使わずに、サービスをコントローラに手動で注入している例です。尚、例題ではComposerによるAutoloadを使用していないので、spl_autoload_register()で代替しています。
  
 <code php index1.php> <code php index1.php>
行 162: 行 145:
 spl_autoload_register(function ($class) spl_autoload_register(function ($class)
 { {
-    require __DIR__.'/controller.php';+    require __DIR__.'/Foo.php';
 }); });
  
行 168: 行 151:
 // 手動によるコンストラクター・インジェクション // 手動によるコンストラクター・インジェクション
 //------------------------------------- //-------------------------------------
-$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);
  
行 176: 行 158:
 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>
  
行 190: 行 170:
  
 ==== テスト2 ==== ==== テスト2 ====
-TODO:+ 
 +DIコンテナ― によるコンストラクター・インジェクションの例
  
 <code php index2.php> <code php index2.php>
 +</code>
 +
 +=== 結果 ===
 +<code>
 +</code>
 +
 +==== テスト3 ====
 +League/Containerは **Auto Wiring** 機能をサポートします。これは、コンストラクター引数の型ヒントを調べることにより、オブジェクトとそのすべての依存関係を再帰的に自動的に解決する機能です。但し、注入できるのはオブジェクト型の変数だけです。
 +
 +>Auto Wiring はデフォルトで無効になっているので、有効にするにはコンテナデリゲートとして ''ReflectionContainer'' を登録しなけらばなりません。
 +
 +<code php index3.php>
 <?php declare(strict_types=1); <?php declare(strict_types=1);
 require __DIR__.'/../../vendor/autoload.php'; require __DIR__.'/../../vendor/autoload.php';
行 199: 行 192:
 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;
  
-// リフレクションコンテナーをデリゲートとして登録してAuto Wiringを有効にする +// ReflectionContainerをデリゲートとして登録してAuto Wiringを有効にする 
-// (注)既定では、リフレクションコンテナーは、要求するたびに要求を解決します。+// (注)デフォルトでは、ReflectionContainerは、要求するたびにそれを解決します。
 $container->delegate( $container->delegate(
     new League\Container\ReflectionContainer     new League\Container\ReflectionContainer
行 218: 行 211:
 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\index3.php:23:boolean true 
-D:\usr\ws2019\apricot\test\league-container\index2.php:25:boolean true +D:\usr\ws2019\apricot\test\league-container\index3.php:24:boolean true 
-D:\usr\ws2019\apricot\test\league-container\index2.php:26:boolean true +D:\usr\ws2019\apricot\test\league-container\index3.php:25:boolean true
-D:\usr\ws2019\apricot\test\league-container\index2.php:27:boolean true+
 </code> </code>
  
 \\ \\
  
-==== テスト==== +==== テスト==== 
-> TODO:+デフォルトでは ReflectionContainer は、要求の度にそれを解決しようとします。ReflectionContainer でキャッシュ機能を有効にするには以下のようにcacheResolutions()を使用します。
  
-<code php index3.php>+<code php index4.php>
 <?php declare(strict_types=1); <?php declare(strict_types=1);
 require __DIR__.'/../../vendor/autoload.php'; require __DIR__.'/../../vendor/autoload.php';
行 241: 行 232:
 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のキャッシュを有効にするに、以下のようにします
 $container->delegate( $container->delegate(
     (new League\Container\ReflectionContainer)->cacheResolutions()     (new League\Container\ReflectionContainer)->cacheResolutions()
行 262: 行 253:
 === 結果 === === 結果 ===
 <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.txt · 最終更新: 2020/04/19 22:14 by y2sunlight