Laravel4、依存注入とコンテナ(5)
タグ: Laravel4
ジュース屋さんは大繁盛です。お客さんも増えました。
お客さんの中に、どうしてもミックスジュースが飲みたいという方がいらっしゃいました。仕方ありません。ご要望に答えましょう。
<?php
class MixJuice
{
// $fruitsはインスタンスの配列
// そのため自動解決はできない
public function __construct( $fruits )
{
$this->fruites = $fruits;
}
public function make()
{
$energy = 0;
foreach( $this->fruites as $fruit )
{
$energy += $fruit->get();
}
return $energy * 4;
}
}
この様な場合、自動解決はできません。コンストラクターに渡されるのが果物のクラスのインスタンスの配列です。インスタンスではありません。
こうした場合、明確にMixJuiceインスタンスの生成方法を指定する必要があります。
App::bind( 'MixJuice', function() {
return new MixJuice ( array(
new Banana, new Apple, new Orange
);
});
テストでも、インスタンスの配列を渡せばシンプルに実行できます。
<?php
use Mockery as m;
class MixJuiceTest extends TestCase
{
public function testGet()
{
$fruit1Mock = m::mock( 'FruitInterface' );
$fruit1Mock->shouldReceive( 'get' )
->once()
->withNoArgs()
->andReturn( 3 );
$fruit2Mock = m::mock( 'FruitInterface' );
$fruit2Mock->shouldReceive( 'get' )
->once()
->withNoArgs()
->andReturn( 5 );
$fruit3Mock = m::mock( 'FruitInterface' );
$fruit3Mock->shouldReceive( 'get' )
->once()
->withNoArgs()
->andReturn( 7 );
$mixJuice = new MixJuice( array( $fruit1Mock, $fruit2Mock, $fruit3Mock, ) );
$this->assertEquals( 60, $mixJuice->make() );
}
}
今回のチュートリアルは、コンテナの使い方をメインに理解してもらうためのものです。もし、実際にジュース製造クラスを作成するなら、もっと柔軟に材料を指定できるように作成しましょう。わざわざ、材料を変えるのにIoCコンテナの結合の指定を変更しなくてはならないのは、やはり面倒ですからね。;)
今回はともかく、自動解決できないパターンもあることを頭の片隅に入れておいてください。
- Larave4、依存注入とコンテナ(1)
- Larave4、依存注入とコンテナ(2)
- Larave4、依存注入とコンテナ(3)
- Larave4、依存注入とコンテナ(4)
- Larave4、依存注入とコンテナ(5)
- Larave4、依存注入とコンテナ(6)
Laravelでのテストについて、もっと知りたい方は、Laravel Testing Decodedをどうぞ。Laravelの構造や、Laravelで大きなプログラムを作成したい方は、Laravel: 見習いから職人へをどうぞ。