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: 見習いから職人へをどうぞ。