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コンテナの結合の指定を変更しなくてはならないのは、やはり面倒ですからね。;)

今回はともかく、自動解決できないパターンもあることを頭の片隅に入れておいてください。

Laravelでのテストについて、もっと知りたい方は、Laravel Testing Decodedをどうぞ。Laravelの構造や、Laravelで大きなプログラムを作成したい方は、Laravel: 見習いから職人へをどうぞ。