Laravelのサービスコンテナについて簡単に書いてみた#1


◆サービスコンテナ

クラスのインスタンスを一括管理し、シングルトンなら、内部にキャッシュしているものを返す
サービスコンテナの実体はIlluminate\Foundation\Application

[サービスコンテナ主なメソッド]https://qiita.com/mikakane/items/21ad883f2d83fdd76463

◆サービスコンテナのバインド処理

バインド = インスタンスの生成方法をサービスコンテナに登録(結合)すること

登録することで実際に呼び出せるようになる。

引数(名前, インスタンスの生成処理)   名前に決まりはない
app()->bind('Sample::class', function() {
    return new Sample();
});

$sample = app()->make('Sample::class');//サービスコンテナに要求してインスタンスゲット(laravelでは解決という)

どこのクラスでバインドしても大丈夫だが、登録系をまとめているのが、サービスプロバイダーなので、そこでバインドするのがいい

(別名バインド)
bindメソッドの第一引数をkeyとvalueの配列で指定してもOK

[その他のバインドメソッド]https://www.wakuwakubank.com/posts/456-laravel-container-provider/

◆解決(サービスコンテナからの取り出し方)

解決とは、サービスコンテナからクラスのインスタンスをもらうことらしい
方法は、どちらでもよい(個人的には短いほうが好み)
・app(名前)
・app()->make(名前)
・\$app = app();の後に\$app['名前']でも取り出せる。

◆バインドしていない文字列の解決

$app = app(Sample::class);

と呼ぶと、

app()->bind(Sample::class,function(){
    return new Sample();
});

とバインドする記述をしなくても使える場合がある。
bindの第一引数をよく見てほしい。上の例では、解決するときに''で囲っていたが、今回はクラス自体を指定している。
つまり、解決するときにクラス自体を指定すると、バインドしていなくても勝手に解決してくれる。(もちろんuse文は必要だが)

◆使いどころ

学習していて、bindっていつ使うのと正直思った。(new クラス()でいいじゃん)
laravelでは、標準装備(サービスコンテナに登録された)のものはどこでも利用できるようになっている。
サービスコンテナに登録することは、そのアプリ全体で使いたい・標準装備にする必要のある機能をまとめて、またそれを機能ごとにサービスプロバイダーファイルを分けて、登録処理を書いて、まとめておけるのが、メリットなのかなぁと感じた。(新しくこのプロジェクトの作成に加わった人は、共通機能(例:認証)を使うのは、このサービスプロバイダーファイルを見ればいい的な感じで)

調べてはみたもののこれなら、使わなくてもいいんじゃと思ったがもっといいことがあった。(調べ不足だっただけ)

[もっと大きなメリットを見つけた]

ちょっと長くなるので、次回の記事に書かせていただく。
[次回記事リンク]https://qiita.com/hekizi/items/a7ba61ef59c1093ee835