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
DIとLaravel
Search
polidog
PRO
November 23, 2018
Programming
460
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DIとLaravel
polidog
PRO
November 23, 2018
More Decks by polidog
See All by polidog
AIがコードを書く時代の ジェネレーティブプログラミング
polidog
PRO
3
1.2k
小さな開発会社を作った理由(再)
polidog
PRO
0
290
React Server ComponentsでAPI不要の開発体験
polidog
PRO
1
870
小さな開発会社が受託開発に力を入れる理由
polidog
PRO
0
540
小さな開発会社を作った理由
polidog
PRO
1
3.6k
小さな開発会社がWebサービスを作る理由
polidog
PRO
1
870
トランザクションスクリプトは何がダメなのか?
polidog
PRO
2
4.1k
React初心者がHooksを理解するためにコードを読んでみた
polidog
PRO
0
620
object-mapperを作ってる話
polidog
PRO
0
410
Other Decks in Programming
See All in Programming
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
630
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
130
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
450
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
560
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
170
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
570
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
210
React本体のコードリーディング
high_g_engineer
1
120
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
610
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
460
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.5k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
340
Faster Mobile Websites
deanohume
310
32k
How to train your dragon (web standard)
notwaldorf
97
6.7k
The SEO identity crisis: Don't let AI make you average
varn
0
520
Designing for humans not robots
tammielis
254
26k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
Leo the Paperboy
mayatellez
8
2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
370
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.8k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Transcript
DIͱLaravel @polidog
ࣗݾհ • @polidog • ੩Ԭग़ • ౦ژͰSymfonyॻ͍ͯ͝൧৯͍ͯ·͢ • SymfonyϢʔβʔձͷਓ •
Symfony͖Ͱ͢
Dependency Injectionʁ
1 <?php 2 3 namespace App\Http\Controllers; 4 5 6 use
App\Executor; 7 8 class Index extends Controller 9 { 10 /** 11 * @var Executor 12 */ 13 private $executor; 14 15 /** 16 * IndexController constructor. 17 * @param Executor $executor 18 */ 19 public function __construct(Executor $executor) 20 { 21 $this->executor = $executor; 22 } 23 24 public function __invoke() 25 {
ίϯϙʔωϯτؒͷґଘؔ ΛϓϩάϥϜͷιʔείʔυ ͔Βഉআ͠ɺ֎෦ͷઃఆϑΝ ΠϧͳͲͰೖͰ͖ΔΑ͏ʹ ͢ΔιϑτΣΞύλʔϯ (wikipedia)
None
ར༻͢ΔΦϒδΣΫτͷੜ ʹؔ͢ΔࣝΛอ࣋͠ͳ͍
ίϯετϥΫλͷҾͰ ґଘ͢ΔΦϒδΣΫτΛࢦఆ ͢Δ
1 <?php 2 3 namespace App\Http\Controllers; 4 5 6 use
App\Executor; 7 8 class Index extends Controller 9 { 10 /** 11 * @var Executor 12 */ 13 private $executor; 14 15 /** 16 * IndexController constructor. 17 * @param Executor $executor 18 */ 19 public function __construct(Executor $executor) 20 { 21 $this->executor = $executor; 22 } 23 24 public function __invoke() 25 {
ͦͯ͠֎෦͔ΒͦͷΦϒδΣ ΫτΛͯ͠Β͏
ར༻͢ΔΦϒδΣΫτͷੜ ʹؔ͢ΔࣝΛอ࣋͠ͳ͍ࣄ
Service Container
αʔϏείϯςφͱʁ • ΦϒδΣΫτͷੜखॱͷཧ • ੜͨ͠ΦϒδΣΫτͷཧ
app()
࣮ࡍʹDIΛମݧͯ͠ΈΔ
1 <?php 2 3 namespace App\Http\Controllers; 4 5 6 use
App\Executor; 7 8 class Index extends Controller 9 { 10 /** 11 * @var Executor 12 */ 13 private $executor; 14 15 /** 16 * IndexController constructor. 17 * @param Executor $executor 18 */ 19 public function __construct(Executor $executor) 20 { 21 $this->executor = $executor; 22 } 23 24 public function __invoke() 25 {
5 6 class Executor 7 { 8 /** 9 *
@var Processor 10 */ 11 private $output; 12 13 /** 14 * @var string 15 */ 16 private $name; 17 18 /** 19 * Executor constructor. 20 * @param Processor $output 21 * @param string $name 22 */ 23 public function __construct(Processor $output, string $name) 24 { 25 $this->output = $output; 26 $this->name = $name; 27 } 28 29 public function run() : string
None
5 6 class Executor 7 { 8 /** 9 *
@var Processor 10 */ 11 private $output; 12 13 /** 14 * @var string 15 */ 16 private $name; 17 18 /** 19 * Executor constructor. 20 * @param Processor $output 21 * @param string $name 22 */ 23 public function __construct(Processor $output, string $name) 24 { 25 $this->output = $output; 26 $this->name = $name; 27 } 28 29 public function run() : string
Binding Primitives https://laravel.com/docs/5.7/container
5 use App\Executor; 6 use Illuminate\Support\ServiceProvider; 7 8 class AppServiceProvider
extends ServiceProvider 9 { 10 /** 11 * Bootstrap any application services. 12 * 13 * @return void 14 */ 15 public function boot() 16 { 17 // 18 } 19 20 /** 21 * Register any application services. 22 * 23 * @return void 24 */ 25 public function register() 26 { 27 $this->app->when(Executor::class) 28 ->needs('$name') 29 ->give(config('app.name')); 30 }
Interface
5 6 use App\ExecutorInterface; 7 8 class Index extends Controller
9 { 10 /** 11 * @var ExecutorInterface 12 */ 13 private $executor; 14 15 /** 16 * Index constructor. 17 * @param ExecutorInterface $executor 18 */ 19 public function __construct(ExecutorInterface $executor) 20 { 21 $this->executor = $executor; 22 } 23 24 public function __invoke() 25 { 26 return view('index', [ 27 'message' => $this->executor->run() 28 ]); 29 } 30
None
9 class AppServiceProvider extends ServiceProvider 10 { 11 /** 12
* Bootstrap any application services. 13 * 14 * @return void 15 */ 16 public function boot() 17 { 18 // 19 } 20 21 /** 22 * Register any application services. 23 * 24 * @return void 25 */ 26 public function register() 27 { 28 $this->app->bind(ExecutorInterface::class, Executor::class); 29 $this->app->when(Executor::class) 30 ->needs('$name') 31 ->give(config('app.name')); 32 } 33 }
bind?
ΦϒδΣΫτͷੜखॱΛొ ͢Δ
make?
࣮ࡍʹΦϒδΣΫτΛੜ͢ Δ
?>