LoginSignup
0
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-03-21

◆サービスコンテナ

クラスのインスタンスを一括管理し、シングルトンなら、内部にキャッシュしているものを返す
サービスコンテナの実体は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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1