Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LaravelでDIを扱う仕組み ~Service ContainerとService Pro...
Search
2bo
December 05, 2019
Technology
2
1.5k
LaravelでDIを扱う仕組み ~Service ContainerとService Provider~
2bo
December 05, 2019
Tweet
Share
More Decks by 2bo
See All by 2bo
LaravelでGraphQLを試してみた
tsubokoh
0
530
Other Decks in Technology
See All in Technology
251029 JAWS-UG AI/ML 退屈なことはQDevにやらせよう
otakensh
0
120
東京大学「Agile-X」のFPGA AIデザインハッカソンを制したソニーのAI最適化
sony
0
180
Kotlinで型安全にバイテンポラルデータを扱いたい! ReladomoラッパーをAIと実装してみた話
itohiro73
3
120
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
2
180
datadog-incident-management-intro
tetsuya28
0
110
20251027_findyさん_音声エージェントLT
almondo_event
2
510
20251024_TROCCO/COMETAアップデート紹介といくつかデモもやります!_#p_UG 東京:データ活用が進む組織の作り方
soysoysoyb
0
140
「タコピーの原罪」から学ぶ間違った”支援” / the bad support of Takopii
piyonakajima
0
160
AI駆動で進める依存ライブラリ更新 ─ Vue プロジェクトの品質向上と開発スピード改善の実践録
sayn0
1
360
進化する大規模言語モデル評価: Swallowプロジェクトにおける実践と知見
chokkan
PRO
2
370
GraphRAG グラフDBを使ったLLM生成(自作漫画DBを用いた具体例を用いて)
seaturt1e
1
170
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
180
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Why Our Code Smells
bkeepers
PRO
340
57k
What's in a price? How to price your products and services
michaelherold
246
12k
Product Roadmaps are Hard
iamctodd
PRO
55
11k
Faster Mobile Websites
deanohume
310
31k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
36
6.1k
Documentation Writing (for coders)
carmenintech
75
5.1k
The Cost Of JavaScript in 2023
addyosmani
55
9.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Context Engineering - Making Every Token Count
addyosmani
8
320
Building an army of robots
kneath
306
46k
Transcript
LaravelでDIを扱う仕組み ~Service ContainerとService Provider~ 19.12.05 @AkogareSe
• @AkogareSe • エンジニア8年目 ◦ SIer->社内エンジニア ◦ PHP歴1年 ◦ Laravel勉強中
◦ AWS/Vue.js勉強したい • 旅行好き • IKEAシャークかわいい 自己紹介
話すこと • Dependency Injection(DI)の簡単な説明 • LaravelでDIを扱うための機能 ◦ Service Container ◦
Service Provider
DIとは? • 日本語では「依存性の注入」という • オブジェクト指向プログラミングのデザインパターン
依存とは? • あるクラスの処理が別の具体クラスの存在を前提にしていること ◦ 別クラスのオブジェクトを処理の中で生成すること
依存の例
Mailer ------------------------------------------------------- send() RecommendService ------------------------------------------------------- recommend() RecommendServiceクラスが Mailerに依存している状態 依存 利用
依存の何が問題? • 単体テストしづらい ◦ テストの時はメール送りたくない ◦ Mailerにテスト用の分岐処理を追加する • 依存する側の再利用性の低下 ◦
メールではなく、場合によってSMSで送りたい ◦ RecommendServiceをそのまま利用できない
DI = 利用するオブジェクトを外部から注入 • 利用するオブジェクトを引数で渡す • パターン ◦ コンストラクタ ◦
メソッド ◦ セッター
DIの例
Mailer RecommendService Mailerに依存していない send()を持つクラスであればよい 利用
DIの効果 • 振る舞いを外部から変えられる ◦ send()さえ実装されていればどんなオブジェクトでもよい ▪ 実際にはメールを送らないもの ▪ SMS送信するもの ▪
Line送信するもの ▪ etc
DIの課題とコンテナ • 課題 ◦ 注入するオブジェクトの生成をどこでやるか? ◦ オブジェクトが多かったり、入れ子だと生成が大変 ▪ A,B,C ▪
A->B->C • DIコンテナ ◦ DIに必要な機能を提供するソフト/フレームワーク ◦ 注入するオブジェクトの生成、管理を担う
ここまではわかった
ここからはLaravelの話
Laravel勉強中出会った謎の用語 • “Service Container” と “Service Provider” • どうやらDIに関連するものらしい...?
ドキュメント読んでみた...けど??? • Service Container ❝Laravelのサービスコンテナは、クラス間の依存を管理する強力な管理ツールです。❞ • Service Provider ❝サービスプロバイダは、 Laravelアプリケーション全体の起動処理における、初めの心臓部です。
❞ https://readouble.com/laravel/6.x/ja/ より
None
つまり何? • Service Container ◦ DIコンテナ • Service Provider ◦
Laravelのサービス(機能)の初期化処理を書くクラス ◦ SCへオブジェクトの生成方法を登録する場所として使われる
SCの自動注入機能
Hello ------------------------------------------------------- say() GreetingController ------------------------------------------------------- geet() コントローラメソッドの型宣言を見て オブジェクトを自動で生成/注入 依存 利用
これだと依存したまま
抽象化する
GreetingInterface ------------------------------------- say() GreetingController ------------------------------------ greet() 依存 Hello -------------------------------------- say()
実装 GreetingInterfaceに依存するように変更
これだけでは動かない
SCにインターフェイスとオブジェクトの対応を登録 • bind()で登録 • GreetingInterfaceの型指定に対して、Helloオブジェクトを生成・注入させる
結局Helloに依存?
bind()用の場所がある
Service Provider
Service Provider • register()はSCへのバインド処理を書くための既定メソッド • Laravelの初期化処理時に実行される
まとめ • DI ◦ 利用するオブジェクトを引数で渡してやること ◦ 振る舞いを後から変えられる • DIコンテナ ◦
DIに必要な機能を提供してくれるもの • Service Container ◦ LaravelのDIコンテナ • Service Provider ◦ SCにオブジェクトの生成ルールを登録するところ
おわり
おまけ
GreetingInterface ------------------------------------- say() GreetingController ------------------------------------ greet() 依存 Hello ------------ say()
実装 GreetingInterfaceを実装したGoodByeクラスを追加 GoodBye ------------ say() 実装
bind()メソッドにはクロージャを渡すこともできる • クロージャの戻値はSCに生成してほしいインスタンス • 動的なバインドが可能
ほんとのおわり