Ground Sunlight

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

ユーザ用ツール

サイト用ツール


basic-library:league-container:3.3

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
最新のリビジョン 両方とも次のリビジョン
basic-library:league-container:3.3 [2020/04/19 16:00]
y2sunlight
basic-library:league-container:3.3 [2020/04/19 16:41]
y2sunlight [League/Containerについて]
行 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つが候補に残りました:
行 171: 行 167:
 ==== テスト2 ==== ==== テスト2 ====
  
-DIコンテナ― によるコンストラクター・インジェクションの例+DIコンテナ― によるコンストラクター・インジェクションの例です。依存関係をクラスコンストラクターに渡すことは、依存性注入の最も簡単な方法です。League/Container ではコンストラクター・インジェクションの他に、セッター・インジェクションとクラスファクトリーによる依存性注入の方法もサポートしています。
  
 <code php index2.php> <code php index2.php>
 +<?php declare(strict_types=1);
 +require __DIR__.'/../../vendor/autoload.php';
 +
 +// ComposerのAutoloadの代替
 +spl_autoload_register(function ($class)
 +{
 +    require __DIR__.'/Foo.php';
 +});
 +
 +//-------------------------------------
 +// DIコンテナによるコンストラクター・インジェクション
 +//-------------------------------------
 +$container = new League\Container\Container;
 +
 +$container
 +    ->add(Acme\Foo::class)
 +    ->addArgument(Acme\Bar::class)
 +    ->addArgument(Acme\Baz::class)
 +;
 +$container->add(Acme\Bar::class);
 +$container->add(Acme\Baz::class);
 +
 +$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>
  
 === 結果 === === 結果 ===
 <code> <code>
 +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:27:boolean true
 </code> </code>
 +
 +\\
  
 ==== テスト3 ==== ==== テスト3 ====
basic-library/league-container/3.3.txt · 最終更新: 2020/04/19 22:14 by y2sunlight