|
|
@ -9,7 +9,8 @@ |
|
|
|
依存注入 <span id="dependency-injection"></span> |
|
|
|
依存注入 <span id="dependency-injection"></span> |
|
|
|
-------- |
|
|
|
-------- |
|
|
|
|
|
|
|
|
|
|
|
Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。これは、次の種類の依存注入をサポートしています: |
|
|
|
Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を提供します。 |
|
|
|
|
|
|
|
これは、次の種類の依存注入をサポートしています: |
|
|
|
|
|
|
|
|
|
|
|
* コンストラクタ・インジェクション |
|
|
|
* コンストラクタ・インジェクション |
|
|
|
* メソッド・インジェクション |
|
|
|
* メソッド・インジェクション |
|
|
@ -19,10 +20,10 @@ Yii は [[yii\di\Container]] クラスを通して DI コンテナの機能を |
|
|
|
|
|
|
|
|
|
|
|
### コンストラクタ・インジェクション <span id="constructor-injection"></span> |
|
|
|
### コンストラクタ・インジェクション <span id="constructor-injection"></span> |
|
|
|
|
|
|
|
|
|
|
|
DI コンテナは、コンストラクタのパラメータの型ヒントの助けを借りた、コンストラクタ・インジェクションをサポートしています。 |
|
|
|
DI コンテナは、コンストラクタ引数の型ヒントの助けを借りて、コンストラクタ・インジェクションをサポートしています。 |
|
|
|
型ヒントは、コンテナが新しいオブジェクトの作成に使用されるさい、オブジェクトがどういうクラスやインタフェイスに依存しているかをコンテナに教えます。 |
|
|
|
コンテナが新しいオブジェクトの作成に使用されるさい、そのオブジェクトがどういうクラスやインタフェイスに依存しているかを、型ヒントがコンテナに教えます。 |
|
|
|
コンテナは、依存クラスやインタフェイスのインスタンスを取得することを試み、コンストラクタを通して、新しいオブジェクトにそれらを注入します。 |
|
|
|
コンテナは、依存するクラスやインタフェイスのインスタンスを取得して、 |
|
|
|
たとえば |
|
|
|
コンストラクタを通して、新しいオブジェクトにそれらを注入しようと試みます。たとえば |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
class Foo |
|
|
|
class Foo |
|
|
@ -42,9 +43,10 @@ $foo = new Foo($bar); |
|
|
|
### メソッド・インジェクション <span id="method-injection"></span> |
|
|
|
### メソッド・インジェクション <span id="method-injection"></span> |
|
|
|
|
|
|
|
|
|
|
|
通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。 |
|
|
|
通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。 |
|
|
|
メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、大半のユースケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。 |
|
|
|
メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、 |
|
|
|
|
|
|
|
大半のユース・ケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。 |
|
|
|
|
|
|
|
|
|
|
|
クラスのメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。 |
|
|
|
クラス・メソッドを次の例の `doSomething` メソッドのように定義することが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
class MyClass extends \yii\base\Component |
|
|
|
class MyClass extends \yii\base\Component |
|
|
@ -61,19 +63,18 @@ class MyClass extends \yii\base\Component |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
このメソッドを呼ぶためには、あなた自身で `\my\heavy\Dependency` のインスタンスを渡すか、または、次のように |
|
|
|
このメソッドを呼ぶためには、あなた自身で `\my\heavy\Dependency` のインスタンスを渡すか、または、次のように [[yii\di\Container::invoke()]] を使います。 |
|
|
|
[[yii\di\Container::invoke()]] を使います。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
$obj = new MyClass(/*...*/); |
|
|
|
$obj = new MyClass(/*...*/); |
|
|
|
Yii::$container->invoke([$obj, 'doSomething'], ['param1' => 42]); // $something は DI コンテナによって提供される |
|
|
|
Yii::$container->invoke([$obj, 'doSomething'], ['param1' => 42]); // $something は DI コンテナによって提供される |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### セッター/プロパティ・インジェクション <span id="setter-and-property-injection"></span> |
|
|
|
### セッター/プロパティ・インジェクション <span id="setter-and-property-injection"></span> |
|
|
|
|
|
|
|
|
|
|
|
セッター/プロパティ・インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。 |
|
|
|
セッター/プロパティ・インジェクションは、[構成情報](concept-configurations.md) を通してサポートされます。 |
|
|
|
依存を登録するときや、新しいオブジェクトを作成するときに、対応するセッターまたはプロパティを通しての依存注入に使用される構成情報を、コンテナに提供することが出来ます。 |
|
|
|
依存を登録するときや、新しいオブジェクトを作成するときに、対応するセッターまたはプロパティを通しての依存注入に使用される構成情報を、 |
|
|
|
|
|
|
|
コンテナに提供することが出来ます。 |
|
|
|
たとえば |
|
|
|
たとえば |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
@ -103,9 +104,11 @@ $container->get('Foo', [], [ |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Info: [[yii\di\Container::get()]] メソッドは三番目のパラメータを、生成されるオブジェクトに適用されるべき構成情報配列として受け取ります。 |
|
|
|
> Info: [[yii\di\Container::get()]] メソッドは三番目のパラメータを、生成されるオブジェクトに適用されるべき構成情報配列として受け取ります。 |
|
|
|
クラスが [[yii\base\Configurable]] インタフェイスを実装している場合 (例えば、クラスが [[yii\base\BaseObject]] である場合) には、この構成情報配列がクラスのコンストラクタの最後のパラメータとして渡されます。 |
|
|
|
クラスが [[yii\base\Configurable]] インタフェイスを実装している場合 (例えば、クラスが [[yii\base\BaseObject]] である場合) には、 |
|
|
|
|
|
|
|
この構成情報配列がクラスのコンストラクタの最後のパラメータとして渡されます。 |
|
|
|
そうでない場合は、構成情報はオブジェクトが生成された *後で* 適用されることになります。 |
|
|
|
そうでない場合は、構成情報はオブジェクトが生成された *後で* 適用されることになります。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### PHP コーラブル・インジェクション <span id="php-callable-injection"></span> |
|
|
|
### PHP コーラブル・インジェクション <span id="php-callable-injection"></span> |
|
|
|
|
|
|
|
|
|
|
|
この場合、コンテナは、登録された PHP のコーラブルを使用して、クラスの新しいインスタンスを構築します。 |
|
|
|
この場合、コンテナは、登録された PHP のコーラブルを使用して、クラスの新しいインスタンスを構築します。 |
|
|
@ -123,8 +126,7 @@ $container->set('Foo', function ($container, $params, $config) { |
|
|
|
$foo = $container->get('Foo'); |
|
|
|
$foo = $container->get('Foo'); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、スタティックなクラスメソッドをコーラブルとして使うことが出来ます。 |
|
|
|
新しいオブジェクトを構築するための複雑なロジックを隠蔽するために、スタティックなクラスメソッドをコーラブルとして使うことが出来ます。例えば、 |
|
|
|
例えば、 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
class FooBuilder |
|
|
|
class FooBuilder |
|
|
@ -148,8 +150,7 @@ $foo = $container->get('Foo'); |
|
|
|
依存を登録する <span id="registering-dependencies"></span> |
|
|
|
依存を登録する <span id="registering-dependencies"></span> |
|
|
|
-------------- |
|
|
|
-------------- |
|
|
|
|
|
|
|
|
|
|
|
[[yii\di\Container::set()]] を使って依存を登録することができます。 |
|
|
|
[[yii\di\Container::set()]] を使って依存を登録することができます。登録には依存の名前だけでなく、依存の定義が必要です。 |
|
|
|
登録には依存の名前だけでなく、依存の定義が必要です。 |
|
|
|
|
|
|
|
依存の名前は、クラス名、インタフェイス名、エイリアス名を指定することができます。 |
|
|
|
依存の名前は、クラス名、インタフェイス名、エイリアス名を指定することができます。 |
|
|
|
依存の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。 |
|
|
|
依存の定義には、クラス名、構成情報配列、PHPのコーラブルを指定できます。 |
|
|
|
|
|
|
|
|
|
|
@ -198,10 +199,12 @@ $container->set('db', function ($container, $params, $config) { |
|
|
|
$container->set('pageCache', new FileCache); |
|
|
|
$container->set('pageCache', new FileCache); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Note: 依存の名前が対応する依存の定義と同じである場合は、それを DI コンテナに登録する必要はありません。 |
|
|
|
> Note: 依存の名前が対応する依存の定義と同じである場合は、 |
|
|
|
|
|
|
|
それを DI コンテナに登録する必要はありません。 |
|
|
|
|
|
|
|
|
|
|
|
`set()` を介して登録された依存は、依存が必要とされるたびにインスタンスを生成します。 |
|
|
|
`set()` を介して登録された依存は、依存が必要とされるたびにインスタンスを生成します。 |
|
|
|
[[yii\di\Container::setSingleton()]] を使うと、単一のインスタンスしか生成しない依存を登録することができます: |
|
|
|
[[yii\di\Container::setSingleton()]] を使うと、 |
|
|
|
|
|
|
|
単一のインスタンスしか生成しない依存を登録することができます: |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
$container->setSingleton('yii\db\Connection', [ |
|
|
|
$container->setSingleton('yii\db\Connection', [ |
|
|
@ -221,9 +224,10 @@ $container->setSingleton('yii\db\Connection', [ |
|
|
|
依存を解決します。依存の解決は再帰的に行われます。つまり、ある依存が他の依存を持っている場合、 |
|
|
|
依存を解決します。依存の解決は再帰的に行われます。つまり、ある依存が他の依存を持っている場合、 |
|
|
|
それらの依存も自動的に解決されます。 |
|
|
|
それらの依存も自動的に解決されます。 |
|
|
|
|
|
|
|
|
|
|
|
[[yii\di\Container::get()|get()]] を使って、オブジェクトのインスタンスを取得または作成することができます。 |
|
|
|
[[yii\di\Container::get()|get()]] を使って、オブジェクトのインスタンスを作成または取得することができます。 |
|
|
|
このメソッドは依存の名前を引数として取ります、依存の名前は、クラス名、インタフェイス名、あるいは、エイリアス名で指定できます。 |
|
|
|
このメソッドは依存の名前を引数として取りますが、依存の名前は、クラス名、インタフェイス名、あるいは、エイリアス名で指定できます。 |
|
|
|
依存の名前は、 [[yii\di\Container::set()|set()]] または [[yii\di\Container::setSingleton()|setSingleton()]] を介して登録されている場合もあります。 |
|
|
|
依存の名前は、 [[yii\di\Container::set()|set()]] を介して登録されていることもあれば、 |
|
|
|
|
|
|
|
[[yii\di\Container::setSingleton()|setSingleton()]] を介して登録されていることもあります。 |
|
|
|
オプションで、クラスのコンストラクタのパラメータのリストや、[設定情報](concept-configurations.md) を渡して、新しく作成されるオブジェクトを構成することも出来ます。 |
|
|
|
オプションで、クラスのコンストラクタのパラメータのリストや、[設定情報](concept-configurations.md) を渡して、新しく作成されるオブジェクトを構成することも出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
たとえば、 |
|
|
|
たとえば、 |
|
|
@ -237,13 +241,13 @@ $engine = $container->get('app\components\SearchEngine', [$apiKey, $apiSecret], |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
見えないところで、DIコンテナは、単に新しいオブジェクトを作成するよりもはるかに多くの作業を行います。 |
|
|
|
見えないところで、DIコンテナは、単に新しいオブジェクトを作成するよりもはるかに多くの作業を行います。 |
|
|
|
コンテナは、最初にクラスのコンストラクタを調査し、依存クラスまたはインタフェイスの名前を見つけると、 |
|
|
|
コンテナは、最初にクラスのコンストラクタを調査し、依存するクラスまたはインタフェイスの名前を見つけると、 |
|
|
|
自動的にそれらの依存を再帰的に解決します。 |
|
|
|
自動的にそれらの依存を再帰的に解決します。 |
|
|
|
|
|
|
|
|
|
|
|
次のコードでより洗練された例を示します。`UserLister` クラスは `UserFinderInterface` |
|
|
|
次のコードでより洗練された例を示します。`UserLister` クラスは `UserFinderInterface` |
|
|
|
インタフェイスを実装するオブジェクトに依存します。`UserFinder` クラスはこのインタフェイスを実装していて、かつ、 |
|
|
|
インタフェイスを実装するオブジェクトに依存します。`UserFinder` クラスはこのインタフェイスを実装していて、かつ、 |
|
|
|
`Connection` オブジェクトに依存します。これらのすべての依存は、クラスのコンストラクタのパラメータの型ヒントによって宣言されています。 |
|
|
|
`Connection` オブジェクトに依存します。これらのすべての依存は、クラスのコンストラクタのパラメータの型ヒントによって宣言されています。 |
|
|
|
プロパティ依存性の登録をすれば、DI コンテナは自動的にこれらの依存を解決し、単純に `get('userLister')` |
|
|
|
依存の登録が適切にされていれば、DI コンテナは自動的にこれらの依存を解決し、単純に `get('userLister')` |
|
|
|
を呼び出すだけで新しい `UserLister` インスタンスを作成できます。 |
|
|
|
を呼び出すだけで新しい `UserLister` インスタンスを作成できます。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
@ -313,7 +317,7 @@ Yii は DI コンテナを作成します。この DI コンテナは [[Yii::$co |
|
|
|
Yii は、新しいオブジェクトを作成するコアコードのほとんどにおいて [[Yii::createObject()]] を使用しています。このことは、 |
|
|
|
Yii は、新しいオブジェクトを作成するコアコードのほとんどにおいて [[Yii::createObject()]] を使用しています。このことは、 |
|
|
|
[[Yii::$container]] を操作することでグローバルにオブジェクトをカスタマイズすることができるということを意味しています。 |
|
|
|
[[Yii::$container]] を操作することでグローバルにオブジェクトをカスタマイズすることができるということを意味しています。 |
|
|
|
|
|
|
|
|
|
|
|
例として、 [[yii\widgets\LinkPager]] のページネーションボタンのデフォルト個数をグローバルにカスタマイズしてみましょう。 |
|
|
|
例として、 [[yii\widgets\LinkPager]] のページ・ネーションボタンのデフォルト個数をグローバルにカスタマイズしてみましょう。 |
|
|
|
|
|
|
|
|
|
|
|
```php |
|
|
|
```php |
|
|
|
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]); |
|
|
|
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]); |
|
|
@ -332,7 +336,9 @@ echo \yii\widgets\LinkPager::widget(); |
|
|
|
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); |
|
|
|
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Tip: どのような型の値であろうとも上書きされますので、オプションの配列の指定には気を付けてください。オプションの配列はマージされません。 |
|
|
|
> Tip: ウィジェットの呼び出しで与えられたプロパティは常に DI コンテナが持つ定義を上書きします。 |
|
|
|
|
|
|
|
> たとえ、`'options' => ['id' => 'mypager']` のように配列を指定したとしても、 |
|
|
|
|
|
|
|
> それらは他のオプションとマージされるのでなく、他のオプションを置換えてしまいます。 |
|
|
|
|
|
|
|
|
|
|
|
もう一つの例は、DI コンテナの自動コンストラクタ・インジェクションの利点を活かすものです。 |
|
|
|
もう一つの例は、DI コンテナの自動コンストラクタ・インジェクションの利点を活かすものです。 |
|
|
|
あなたのコントローラ・クラスが、ホテル予約サービスのような、いくつかの他のオブジェクトに依存するとします。 |
|
|
|
あなたのコントローラ・クラスが、ホテル予約サービスのような、いくつかの他のオブジェクトに依存するとします。 |
|
|
@ -366,14 +372,14 @@ class HotelController extends Controller |
|
|
|
これで、あなたが再びコントローラにアクセスするときは、`app\components\BookingService` |
|
|
|
これで、あなたが再びコントローラにアクセスするときは、`app\components\BookingService` |
|
|
|
のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。 |
|
|
|
のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
高度な実際の使用方法 <span id="advanced-practical-usage"></span> |
|
|
|
高度な実際の使用方法 <span id="advanced-practical-usage"></span> |
|
|
|
-------------------- |
|
|
|
-------------------- |
|
|
|
|
|
|
|
|
|
|
|
API アプリケーションを開発していて、以下のクラスを持っているとします。 |
|
|
|
API アプリケーションを開発していて、以下のクラスを持っているとします。 |
|
|
|
|
|
|
|
|
|
|
|
- `app\components\Request` クラス。`yii\web\Request` から拡張され、追加の機能を提供する。 |
|
|
|
- `app\components\Request` クラス。`yii\web\Request` から拡張され、追加の機能を提供する。 |
|
|
|
- `app\components\Response` クラス。`yii\web\Response` から拡張。生成されるときに、`format` プロパティが `json` に設定されなければならない。 |
|
|
|
- `app\components\Response` クラス。`yii\web\Response` から拡張。 |
|
|
|
|
|
|
|
生成されるときに、`format` プロパティが `json` に設定されなければならない。 |
|
|
|
- `app\storage\FileStorage` および `app\storage\DocumentsReader` クラス。 |
|
|
|
- `app\storage\FileStorage` および `app\storage\DocumentsReader` クラス。 |
|
|
|
何らかのファイルストレージに配置されているドキュメントを操作するロジックを実装する。 |
|
|
|
何らかのファイルストレージに配置されているドキュメントを操作するロジックを実装する。 |
|
|
|
|
|
|
|
|
|
|
@ -395,14 +401,16 @@ API アプリケーションを開発していて、以下のクラスを持っ |
|
|
|
|
|
|
|
|
|
|
|
[[yii\di\Container::setDefinitions()|setDefinitions()]] または [[yii\di\Container::setSingletons()|setSingletons()]] |
|
|
|
[[yii\di\Container::setDefinitions()|setDefinitions()]] または [[yii\di\Container::setSingletons()|setSingletons()]] |
|
|
|
のメソッドに構成情報の配列を渡して、複数の定義を一度に構成することが可能です。 |
|
|
|
のメソッドに構成情報の配列を渡して、複数の定義を一度に構成することが可能です。 |
|
|
|
これらのメソッドは、構成情報配列を反復して、各アイテムに対し、それぞれ [[yii\di\Container::set()|set()]] を呼び出します。 |
|
|
|
これらのメソッドは、構成情報配列を反復して、各アイテムに対し、 |
|
|
|
|
|
|
|
それぞれ [[yii\di\Container::set()|set()]] を呼び出します。 |
|
|
|
|
|
|
|
|
|
|
|
構成情報配列のフォーマットは、 |
|
|
|
構成情報配列のフォーマットは、 |
|
|
|
|
|
|
|
|
|
|
|
- `key`: クラス名、インタフェイス名、または、エイリアス名。 |
|
|
|
- `key`: クラス名、インタフェイス名、または、エイリアス名。 |
|
|
|
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 |
|
|
|
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 |
|
|
|
- `value`: `$class` と関連づけられる定義。指定できる値は、[[yii\di\Container::set()|set()]] の `$definition` |
|
|
|
- `value`: `$class` と関連づけられる定義。指定できる値は、[[yii\di\Container::set()|set()]] の `$definition` |
|
|
|
パラメータのドキュメントで説明されています。[[set()]] メソッドに二番目のパラメータ `$definition` として渡されます。 |
|
|
|
パラメータのドキュメントで説明されています。 |
|
|
|
|
|
|
|
[[set()]] メソッドに二番目のパラメータ `$definition` として渡されます。 |
|
|
|
|
|
|
|
|
|
|
|
例として、上述の要求に従うように私たちのコンテナを構成しましょう。 |
|
|
|
例として、上述の要求に従うように私たちのコンテナを構成しましょう。 |
|
|
|
|
|
|
|
|
|
|
@ -424,9 +432,10 @@ $reader = $container->get('app\storage\DocumentsReader); |
|
|
|
``` |
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
> Tip: バージョン 2.0.11 以降では、アプリケーションの構成情報を使って、宣言的なスタイルでコンテナを構成することが出来ます。 |
|
|
|
> Tip: バージョン 2.0.11 以降では、アプリケーションの構成情報を使って、宣言的なスタイルでコンテナを構成することが出来ます。 |
|
|
|
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) のセクションを参照してください。 |
|
|
|
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) |
|
|
|
これで全部動きますが、`DocumentWriter` クラスを生成する必要がある場合には、 |
|
|
|
のセクションを参照してください。 |
|
|
|
`FileStorage` オブジェクトを生成する行をコピペすることになるでしょう。 |
|
|
|
|
|
|
|
|
|
|
|
これで全部動きますが、`DocumentWriter` クラスを生成する必要がある場合には、`FileStorage` オブジェクトを生成する行をコピペすることになるでしょう。 |
|
|
|
もちろん、それが一番スマートな方法ではありません。 |
|
|
|
もちろん、それが一番スマートな方法ではありません。 |
|
|
|
|
|
|
|
|
|
|
|
[依存を解決する](#resolving-dependencies) のセクションで説明したように、[[yii\di\Container::set()|set()]] と [[yii\di\Container::setSingleton()|setSingleton()]] は、 |
|
|
|
[依存を解決する](#resolving-dependencies) のセクションで説明したように、[[yii\di\Container::set()|set()]] と [[yii\di\Container::setSingleton()|setSingleton()]] は、 |
|
|
@ -435,7 +444,8 @@ $reader = $container->get('app\storage\DocumentsReader); |
|
|
|
|
|
|
|
|
|
|
|
- `key`: クラス名、インタフェイス名、または、エイリアス名。 |
|
|
|
- `key`: クラス名、インタフェイス名、または、エイリアス名。 |
|
|
|
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 |
|
|
|
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。 |
|
|
|
- `value`: 二つの要素を持つ配列。最初の要素は [[set()]] メソッドに二番目のパラメータ `$definition` として渡され、第二の要素が `$params` として渡されます。 |
|
|
|
- `value`: 二つの要素を持つ配列。最初の要素は [[set()]] メソッドに二番目のパラメータ `$definition` |
|
|
|
|
|
|
|
として渡され、第二の要素が `$params` として渡されます。 |
|
|
|
|
|
|
|
|
|
|
|
では、私たちの例を修正しましょう。 |
|
|
|
では、私たちの例を修正しましょう。 |
|
|
|
|
|
|
|
|
|
|
@ -468,9 +478,10 @@ $reader = $container->get('app\storage\DocumentsReader); |
|
|
|
|
|
|
|
|
|
|
|
構成情報の最適化にかかわるもう一つのステップは、いくつかの依存をシングルトンとして登録することです。 |
|
|
|
構成情報の最適化にかかわるもう一つのステップは、いくつかの依存をシングルトンとして登録することです。 |
|
|
|
[[yii\di\Container::set()|set()]] を通じて登録された依存は、必要になるたびに、毎回インスタンス化されます。 |
|
|
|
[[yii\di\Container::set()|set()]] を通じて登録された依存は、必要になるたびに、毎回インスタンス化されます。 |
|
|
|
しかし、ある種のクラスは実行時を通じて状態を変化させませんので、アプリケーションのパフォーマンスを高めるためにシングルトンとして登録することが出来ます。 |
|
|
|
しかし、ある種のクラスは実行時を通じて状態を変化させませんので、 |
|
|
|
|
|
|
|
アプリケーションのパフォーマンスを高めるためにシングルトンとして登録することが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
`app\storage\FileStorage` クラスが好例でしょう。これは単純な API によってファイルシステムに対する何らかの操作を実行するもの |
|
|
|
`app\storage\FileStorage` クラスが好例でしょう。これは単純な API によってファイル・システムに対する何らかの操作を実行するもの |
|
|
|
(例えば `$fs->read()` や `$fs->write()`) ですが、これらの操作はクラスの内部状態を変化させないものです。 |
|
|
|
(例えば `$fs->read()` や `$fs->write()`) ですが、これらの操作はクラスの内部状態を変化させないものです。 |
|
|
|
従って、このクラスのインスタンスを一度だけ生成して、それを複数回使用することが可能です。 |
|
|
|
従って、このクラスのインスタンスを一度だけ生成して、それを複数回使用することが可能です。 |
|
|
|
|
|
|
|
|
|
|
@ -503,7 +514,8 @@ $reader = $container->get('app\storage\DocumentsReader'); |
|
|
|
推奨されるプラクティスは以下のとおりです: |
|
|
|
推奨されるプラクティスは以下のとおりです: |
|
|
|
|
|
|
|
|
|
|
|
* あなたがアプリケーションの開発者である場合は、アプリケーションの構成情報を使って依存を登録することが出来ます。 |
|
|
|
* あなたがアプリケーションの開発者である場合は、アプリケーションの構成情報を使って依存を登録することが出来ます。 |
|
|
|
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) のセクションを読んでください。 |
|
|
|
[構成情報](concept-configurations.md) のガイドの [アプリケーションの構成](concept-configurations.md#application-configurations) |
|
|
|
|
|
|
|
のセクションを読んでください。 |
|
|
|
* あなたが再配布可能な [エクステンション](structure-extensions.md) の開発者である場合は、エクステンションのブートストラップ・クラス内で |
|
|
|
* あなたが再配布可能な [エクステンション](structure-extensions.md) の開発者である場合は、エクステンションのブートストラップ・クラス内で |
|
|
|
依存を登録することができます。 |
|
|
|
依存を登録することができます。 |
|
|
|
|
|
|
|
|
|
|
@ -512,7 +524,8 @@ $reader = $container->get('app\storage\DocumentsReader'); |
|
|
|
------ |
|
|
|
------ |
|
|
|
|
|
|
|
|
|
|
|
依存注入と [サービス・ロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 |
|
|
|
依存注入と [サービス・ロケータ](concept-service-locator.md) はともに、疎結合でよりテストしやすい方法でのソフトウェア構築を可能にする、 |
|
|
|
定番のデザインパターンです。依存注入とサービス・ロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html) |
|
|
|
定番のデザインパターンです。 |
|
|
|
|
|
|
|
依存注入とサービス・ロケータへのより深い理解を得るために、 [Martin の記事](http://martinfowler.com/articles/injection.html) |
|
|
|
を読むことを強くお勧めします。 |
|
|
|
を読むことを強くお勧めします。 |
|
|
|
|
|
|
|
|
|
|
|
Yii はその [サービス・ロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。 |
|
|
|
Yii はその [サービス・ロケータ](concept-service-locator.md) を、依存注入 (DI) コンテナの上に実装しています。 |
|
|
|