Laravel3、コアクラスの実行時置き換え
個人的に少し機能を変更するならば、コアクラスを拡張し、そのクラスを使用すればよいだけですので、何もまるまる置き換える必要は通常ありません。拡張したクラスを使用すればよいだけです。
今回のコアの置き換えとは、単体テスト時や開発時において、実行時にコアクラスをスタブなどに置き換えたい場合のお話です。
Laravelのクラスエイリアス
基本的にコアクラスの名前はクラスのエイリアスです。use文でも定義できるやつです。
あるクラスが呼び出された時にLaravelのオートローダーにより最初に調べられるのが、エイリアス名がLaravelに登録されているかです。
コアクラスのエイリアス名はapplication.php設定ファイルの中で定義されています。これは設定ファイルですから、ユーザーが自由に変更することもできます。
そのため、設定ファイルの定義を変更すれば良いのですが、各テストケースごとにこの設定ファイルを変更するのは手間ですし、柔軟性に欠けています。
実際にLaravelが行なっているのは、設定ファイルの定義を配列に保存しておき、指定されたクラス名がその配列に存在していれば、登録されている完全修飾名前空間付きクラス名でclass_alias()を呼び出すことです。
class_alias関数
同じエイリアス名をclass_alias関数で登録した場合、後の定義が有効になります。
単体テスト時にPHPUnitのテストケースでこの関数を使用し、スタブを対象のコアクラス名で登録したら置き換えができそうですが、できません。Laravelはオートロードの機能の中でこれを呼び出します。つまり、テスト対象のコード中のコアクラスが呼び出される直前のタイミングで、class_alias()が実行されるため、その直前にclass_alias()で別のクラスに置き換えていたとしても、Autoloadクラスが保持していた内容、つまりapplication設定ファイルの内容で置き換えられてしまいます。
Autoloaderクラスの使用
特定クラスを一時的に置き換えたい場合、オートローダーに対象クラスを再登録しましょう。環境ファイルで定義されているエイリアスの内容を実行時に置き換えてしまえば良いわけです。(設定ファイルを書き換えるのではなく、登録配列の中身を変更します。)
Autoloadクラスには、Laravelにクラスのエイリアスを登録するメソッドも用意されています。alias()メソッドです。これは単に登録してある配列に、エイリアス名をキーとして、指定された実際のクラス名を保存するものです。もし、エイリアス名が登録済みであっても、後で登録したもので置き換えることができます。
Autoloader::alias('top\midle\end\stubClass', 'File');
これでコアのFileクラスの代わりに、スタブクラスを動作させることができます。
実際に生成するのが難しいコアクラスからのリターンも、スタブで手軽に生成できます。便利ですよね。