はじめに
現在インターン先でLaravelを使った開発を1年ほどしています。Laravelの核と言われているサービスコンテナを理解するために調ことをメモとして残しておきたいと思います。
サービスコンテナとは
サービスコンテナとは、クラスのインスタンス化を管理してくれる仕組みのことです。
例)Exampleクラスのインスタンスを生成
$example = app()->make(Example::class);
また、上記コードと以下の結果は同じです。
$example = new Example();
これだけだと、サービスコンテナを使う必要ないのでは?と思います。
しかしサービスコンテンナには、依存関係を自動解決をしてくれる働きを持っています。
依存関係の自動解決とは?
以下のように、ExampleクラスがMailクラスに依存しているとします。
class Example
{
public $mail;
public function __construct(Mail $mail)
{
$this->mail = $mail;
}
public function run()
{
$this->mail->send();
}
}
class Mail
{
public function send()
{
\Log::info('sendメソッド実行');
}
}
通常であれば、以下のようにExampleクラスをインスタンス化する前に、Exampleクラスの依存先であるMailクラスのインスタンス化を実行する必要があります。
$mail = new Mail();
$example = new Exmaple($mail);
これをサービスコンテナを使った書き方で書くと以下のようになります。
①bindメソッドでサービスコンテナへ登録
$example = app()->bind('example', Example::class);
②makeメソッドを使ってExampleクラスのインスタンス化
$myClass = app()->make('example');
サービスコンテナが自動的に依存関係を解決するため、上記は正常に実行されます。
まとめ
サービスコンテナの役割について簡単にまとめてみました。
サービスコンテナを使うことで依存関係を自動解決してクラスをインスタンス化してくれることがわかりました。
参考