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
540
Other Decks in Technology
See All in Technology
松尾研LLM講座2025 応用編Day3「軽量化」 講義資料
aratako
11
4.5k
普段使ってるClaude Skillsの紹介(by Notebooklm)
zerebom
8
2.4k
AWSインフルエンサーへの道 / load of AWS Influencer
whisaiyo
0
230
20251219 OpenIDファウンデーション・ジャパン紹介 / OpenID Foundation Japan Intro
oidfj
0
520
AWS re:Invent 2025~初参加の成果と学び~
kubomasataka
1
200
アプリにAIを正しく組み込むための アーキテクチャ── 国産LLMの現実と実践
kohju
0
240
AIエージェントを5分で一気におさらい!AIエージェント「構築」元年に備えよう
yakumo
1
110
Authlete で実装する MCP OAuth 認可サーバー #CIMD の実装を添えて
watahani
0
210
2025-12-27 Claude CodeでPRレビュー対応を効率化する@機械学習社会実装勉強会第54回
nakamasato
4
1.2k
コールドスタンバイ構成でCDは可能か
hiramax
0
110
Identity Management for Agentic AI 解説
fujie
0
500
投資戦略を量産せよ 2 - マケデコセミナー(2025/12/26)
gamella
0
480
Featured
See All Featured
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
73
jQuery: Nuts, Bolts and Bling
dougneiner
65
8.3k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.8k
How to Talk to Developers About Accessibility
jct
1
87
Between Models and Reality
mayunak
0
150
Side Projects
sachag
455
43k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
31
So, you think you're a good person
axbom
PRO
0
1.9k
The SEO identity crisis: Don't let AI make you average
varn
0
39
Deep Space Network (abreviated)
tonyrice
0
22
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
870
Paper Plane (Part 1)
katiecoart
PRO
0
2.2k
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に生成してほしいインスタンス • 動的なバインドが可能
ほんとのおわり