Slim を久しぶりにさわったら、v4 にアップグレードした際に DI コンテナが PHP-DI に変わったようなので、使い方を確認してみた。
インストール
composer でパッケージをインストールする。
1 | $ composer require php-di/php-di |
コンテナを作成する
コンテナを作成するには、
- containerBuilder を作る
- containerBuilder から conatiner を作成する
という手順を取る。具体的には、こんな感じ。
1 |
|
コンテナに設定を保存する
containerBuilder の addDefinitions メソッドの引数の連想配列として設定を保存する。
1 |
|
実行結果は、以下のようになり設定値を取り出している。
1 | array(1) { |
コンテナにインスタンスを登録する
1 |
|
実行結果は、以下のようになる。
1 | object(SampleClass)#23 (2) { |
コンテナから2度インスタンスを取り出しているが、毎回同じ ID のインスタンスがであることから、毎回新しく生成しているのではなく、最初に生成したインスタンスを使いまわしていることがわかる。
DI
サンプルとして、インタフェース DeocoraterService を実装した AsteriskDecorater を使って修飾した文字列を表示する。
1 |
|
重要なのはこの部分で、DecoraterService の実装として AsteriskDecorater を使用すると設定し、ShowService に DecoratorService を注入している。
1 | $containerBuilder->addDefinitions([ |
修飾方法を変えるには、新しい実装を作成し、
1 | class ExclamationDecorater implements DecoraterService |
注入の設定を変更する。
1 | $containerBuilder->addDefinitions([ |
PHP 5.5 以降では、注入するクラス名は文字列と指定するほかに class キーワードをでクラス名を解決することができる。
1 | $containerBuilder->addDefinitions([ |