Laravel4、パッケージのコツとテスト環境

タグ: Laravel4  

パッケージの作成環境はArtisanコマンドで簡単に作成できます。

その時、コアのcomposer.jsonを参考にしてrequireを決めていくと、コアパッケージでは必要なコアのパッケージを一つ一つ指定しているので、同じ事をしてしまいがちです。"require"に一つ一つIlliminateのパッケージを指定してしまうんです。

コアはコアとして作成されているものです。つまり、Laravelフレームワークを構成する部品は、Laravelフレームワーク上では動作できないため、そう指定しているわけです。

しかし、私達が作成するパッケージは、Laravelフレームワーク上で動作させるのが目的です。それでしたら、Illiminateのパッケージを一つ一つ指定するなんてまどろっこしいことをせずとも、フレームワーク全体を指定することができます。

    "require": {
        "laravel/framework": ">=4.0.0"
    },

全コンポーネントが用意されるため、多少のディスクスペースは食いますが、これでLaravelの機能がフルに使用できます。(サービスプロバーダーの中でフル活用は無理ですよ。なにせ準備コードですからね。bootメソッド以降でコアクラスのエイリアスは使用できます。\APPなどと先頭にバックスラッシュもしくは円記号を付け、絶対パスで指定してください。ただし、registerの中では使用できません。)

この後、自前で色々調整し、テスト可能にしました。ローカルでは動きましたが、GitHubに乗せたあと、Travis CIではテストすらまともに動きません。

当然です。ワークベンチを使用しているローカルでは、すでにLaravelの環境(laravel/laravel)とフレームワーク(laravel/framework)が乗っかっている前提ですが、GitHubに乗っけるのはパッケージ部分だけです。laravel/laravelを元にし、環境をセットアップするシェルでも作成しないと、動きません。

そこで、調べたらやはり解決するためのパッケージがありました。

パッケージのテスト環境を整えてくれるパッケージです。

これを含め、パッケージのテスト環境の依存パッケージは、だいたいこんな感じになるでしょう。

    "require-dev": {
        "orchestra/testbench": "2.0.*",
        "phpunit/phpunit": "3.7.*@dev",
        "mockery/mockery": "0.8.*"
    },

composer installをかけた後、パッケージのtestsディレクトリーに、TestCase.phpを作成します。

class TestCase extends Orchestra\Testbench\TestCase
{
}

これが、テストのベースクラスになります。composer.jsonでtestsディレクトリーがクラスマップで読み込まれるように指定するのをお忘れなく。

続いて、このTestCaseクラスの中に、必要に応じて2つのクラスを付け加えます。

    protected function getPackageProviders()
    {
        return array( 'パッケージのサービスプロバイダー' );
    }

    protected function getPackageAliases()
    {
        return array( 'エイリアス名' => 'ファサードクラス' );
    }

名前が示している通りの役割です。

getPackeagePrividersメソッドは、app/config/app.phpのproviders配列に付け加える代わりになります。テスト実行前に、自前のサービスプロバイダーを呼び出してくれます。

getPackageAliasesメソッドは、同じくapp.phpのaliases配列にエイリアスを登録する代わりになります。

両方共に配列ですから、必要に応じて、複数追加できます。

これで、テストがらくらく実行できます。Travis CIでも問題なく動作します。

実際、requireにlaravel/frameworkを指定しないと、パッケージ中の全クラスが、Laravelらしくない、Symfonyを使用しているようなコードになります。(まあ、Symfonyを使用しているから、そりゃそうなんですけど。)それでは、せっかくLaravelを使用している意味がありません。(繰りかえしますが、サービスプロバイダーは準備コードです。Laravel自身の準備も行なっている段階です。全機能を余すところなく使用できるわけではありません。)

自力でセットアップするのも大変な手間です。ワークベンチでお手軽に開発環境が整えられても、それ以降の手間が大きのでは、片手落ちです。

この方法で、らくらく開発でいきましょう。