Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
LaravelでDIを扱う仕組み ~Service ContainerとService Pro...
Search
2bo
December 05, 2019
Technology
1.6k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LaravelでDIを扱う仕組み ~Service ContainerとService Provider~
2bo
December 05, 2019
More Decks by 2bo
See All by 2bo
LaravelでGraphQLを試してみた
tsubokoh
0
570
Other Decks in Technology
See All in Technology
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
120
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
0
300
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
540
【技術的負債conf】事業成長に伴う技術的負債の説明責任とAIによるモニタリング、認知的負債について
i35_267
3
1.8k
Vibe Coding で作ったプロダクトをどう安全に動かすか / How to Safely Run Products Built with Vibe Coding
glidenote
0
400
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
210
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
3
2.4k
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
870
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
3
570
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.4k
事業課題から技術的負債に向き合う
sansantech
PRO
2
2.1k
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
430
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
500
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
330
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
710
Navigating Team Friction
lara
192
16k
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Evolving SEO for Evolving Search Engines
ryanjones
0
300
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
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に生成してほしいインスタンス • 動的なバインドが可能
ほんとのおわり