michiyuの日記

福岡でエンジニアしています

なんで引数にインスタンスを書くだけでインスタンスが渡されるの?

Laravelのサービスコンテナをざっくりわかりたい人に向けて書いています。

なんで引数にクラスを指定するだけでインスタンスができるの?

Laravelで顧客登録機能を実装したとします。

例えば、コントローラのメソッドにこんな書き方をすると、$memberにはMemberのインスタンスを渡すことができると思います。

// 顧客登録メソッド
public function store(Member $member) 
{
    $this->memberService->store($member);
}


いやいやなんで?


クラスを指定して、引数に指定することでなんでインスタンスが渡ってくんの?
全然意味わかんないよ。
Laravel怖いよ。

ってなってました。私。

これなんでかっていうと「サービスコンテナ」のおかげなんです。

サービスコンテナとは

サービスコンテナは
「あるクラスと依存関係にあるクラスのインスタンスを管理する機能」を提供してくれるんです。


は?
ちょっとよくわかんない。。

要するに

コントローラのメソッドに引数が指定されていると、インスタンスを用意してくれたり、既に用意されているときは、それを探したりして、よしなに渡してくれちゃいます。


この依存関係にあるクラスのインスタンスを外部から渡す(注入)ことを「依存性注入」と呼びます。
Dependency InjectionでDIと呼んだりします。

つまり、「サービスコンテナは、Laravelに用意されているDI機能を実装したクラス」と考えていいです。


このサービスコンテナがアプリケーションのベースに用意されているので、簡単に外部クラスをインスタンスし渡してくれます。


ちなみに
この引数にクラスを指定してインスタンスを渡すことを「メソッドインジェクション」と呼びます。


参考

PHPフレームワーク Laravel実践開発

PHPフレームワーク Laravel実践開発