WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
IoCコンテナの自動解決

IoCコンテナの自動解決

このエントリーをはてなブックマークに追加

さて、前回まで、IoCコンテナの結合に、無名関数のコールバックを使用してきました。ところが、IoCコンテナは基本的に設定を全く行わなくても、クラスを解決することが出来ます。

前回までは、App::bindメソッドを使って、filter.phpやioc.php内で、タイプを結合していましたが、この設定が全く必要がないということです。

それでは、前回作成したioc.phpファイルを削除するか(削除した場合は、global.phpの最後の行も削除してください)、App::bindメソッドをコメントアウトしてください。

そして、http://localhost/laravel/publicとすると、「Class trans does not exist」、つまり、「transクラスは、存在しません」とエラーが表示されるはずです。

そこで、routs.phpを下記のように修正すると

Route::get('/',function(){
 $trans=App::make('Trans');
 return $trans->gengo('1920/5/5');
 });
  • 2行目:引数の、’trans’を’Trans’に変更します。

「大正9年5月5日」とブラウザに表示されるはずです。つまり、App::makeメソッドで登録したIoCコンテナのクラス名(trans)ではなく、実際のクラス名(Trans)で、クラスを呼び出す(解決する)ことが出来るのです。

タイプヒントのクラスも解決

また、IoCコンテナは、タイプヒント*に対しても、自動的にクラスを解決して、クラスのインスタンスを生成します。

class FooBar{
 public function __construct(Baz $bas){
 $this->baz=$baz;
 }
 }

2行目:IoCコンテナは、FooBarクラスだけでなく、タイプヒントのBazクラスに対しても依存を自動的に注入し解決します。

 インターフェイスと実装の結合

タイプヒントが具象タイプではなく、インターフェイス*の実装に依存している場合は、どのインターフィスを実装したクラスが注入されるのかをApp::makeメソッドで知らせる必要があります。

App::bind('UserRopositoryInterface','DbUserRepository');

つまり、下記のようなコントローラの場合、

class UserController extends BaseController{
 public function __consutruct(UserRepositoryInterface $users){
 $this->users=$users;
 }

タイプヒントにUsrRepositoryInterfaceを指定していますが、App::bindメソッドで、’DbUserRepository’と結合しているため、DbUserRepositoryがインスタンス化され自動的に注入されます。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です