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自身の準備も行なっている段階です。全機能を余すところなく使用できるわけではありません。)
自力でセットアップするのも大変な手間です。ワークベンチでお手軽に開発環境が整えられても、それ以降の手間が大きのでは、片手落ちです。
この方法で、らくらく開発でいきましょう。