Laravel学習…サービスプロバイダーとサービスコンテナについて。

徒然草2.0

app/Http/routes.phpがLaravel5.3からroute.phpがroutes/web.phpに変更されているの何でだろう。余計なことをしないでいただきたいが、理由は定かではないがroutesのなかにwebのルートがあるというほうが今後の汎用性が高いということだと思われる。web経由以外のルーティングがありえるのか?定かではないが、api.phpやchannels.phpやconsole.phpとかで使われるのだと思われる。(参考URL:https://atuweb.net/201609_where-did-router-laravel53/)今後、APIやコマンドつくる時に利用されるのだろうと思う。

app/Providers/RouteServiceProvider.phpにwebとapiで使う定義が見られるが、ServiceProviderクラスが何なのか分からない。(参考URL:https://readouble.com/laravel/5.3/ja/providers.html)これによれば、、

◆サービスプロバイダの役割とは?

>>>初期起動処理を行うクラスとのこと

◆初期起動処理で行われることとは?

>>>サービスコンテナの結合

>>>イベントリスナの登録

>>>フィルターの登録

>>>ルートの登録

◆その他

>>>config/app.phpにあるprovider配列で各種プロバイダをすべて読み込んでいることが観察できる。なお、初期段階ですべてのプロバイダが読み込まれるわけではなく、遅延ロード(リクエストに応じてロード)されるらしい。

>>>すべてのサービスプロバイダはIlluminate\Support\ServiceProviderを拡張している。ServiceProviderクラスは必ずregisterとbootの2つのメソッドを持つ。registerはサービスコンテナへの登録のみを行う。bootはサービスコンテナに結合のみ行う。(サービスコンテナがなんのことか分からない)

余談だけど、良い解説というものは、頭から読んでいけば新しく登場する言葉の定義や意味が徐々に分かってくる解説であり、悪い解説というものは、未定義の言葉が乱立する解説のことだと思う。プログラミングが嫌になるのは、未定義の言葉が乱立することへ耐え難いからという理由も大きいと思う。

サービスコンテナとは、依存性を管理するツールであるとのこと。なお、依存性注入とは、コンストラクターまたはセッターメソッドで、あるクラスAをあるクラスBへ注入することを意味する。(自分で書いていて意味不明)依存性注入については、なんとなく知っている程度であり、自分で実装する時はたんに生成したクラスをメインのクラスへ参照渡して使って結合度を下げることだと理解しており、小難しい説明されると「え?え?」という感じで混乱する。(参考URL:https://readouble.com/laravel/5.3/ja/container.html)注入することを結合と言うらしい。bindという通常のシンプルな結合方法の他、singletonやinstanceやプリミティブを結合できる。

たぶん、bindは常に新しいインスタンスが生成されるやり方で、singletonはその依存側のオブジェクトがsingletonで呼び出す度に同じオブジェクトを受け取るやり方、instanceはすでに生成されているインスタンスを受け取る方法、プリミティブはeloquentを使った値渡しを意味する。

サービスプロバイダの遅延ロードを使いたければ、deferメソッドにtrueを指定する。

…これら依存性注入はモデルなどに外部クラスの機能を加えるまたは値などを取得する仕組みなので、はじめは気にすることはない。むしろ外部的に共通的な機能をサービスプロバイドしたい時に使うってことなのだと思われる。

コメント

タイトルとURLをコピーしました