Slide 1

Slide 1 text

PHPerKaigi 2024 2024.03.08 Yuta Ohashi

Slide 2

Slide 2 text

/ @blue_goheimochi , , , , PUBG MOBILE,

Slide 3

Slide 3 text

3 • Laravel • Laravel • •

Slide 4

Slide 4 text

Laravel

Slide 5

Slide 5 text

5 Laravel PHP Web • 2010 6 1 • 10 2023 2 • 2 • 2024 3 12 11 • • 2024 •

Slide 6

Slide 6 text

6 Laravel [ ] Google Trends Laravel Symfony CakePHP

Slide 7

Slide 7 text

7 Laravel Laravel - 3 - • • • • • •

Slide 8

Slide 8 text

Laravel

Slide 9

Slide 9 text

9 Laravel • Eloquent • Facede • • Artisan •

Slide 10

Slide 10 text

10 Laravel Route::post('/tsubuyaki', function (Request $request) { $text = $request->text; $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); return redirect('tsubuyaki/complete'); }); routes/web.php

Slide 11

Slide 11 text

11 Laravel Route Route::post('/tsubuyaki', function ( ) { }); routes/web.php

Slide 12

Slide 12 text

12 Laravel Route Route::post('/tsubuyaki', function ( ) { }); routes/web.php /tsubuyaki

Slide 13

Slide 13 text

13 Laravel Route Route::post('/tsubuyaki', function ( ) { }); routes/web.php /tsubuyaki POST

Slide 14

Slide 14 text

14 Laravel Route Route::post('/tsubuyaki', function ( ) { }); routes/web.php /tsubuyaki POST function

Slide 15

Slide 15 text

15 Laravel Dependency Injection Request Request $request $text = $request->text; routes/web.php

Slide 16

Slide 16 text

16 Laravel Dependency Injection Request Request $request $text = $request->text; routes/web.php Request DI

Slide 17

Slide 17 text

17 Laravel Dependency Injection Request Request $request $text = $request->text; routes/web.php Request DI $request->text

Slide 18

Slide 18 text

18 Laravel Eloquent $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); routes/web.php

Slide 19

Slide 19 text

19 Laravel Eloquent $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); routes/web.php Eloquent artisan

Slide 20

Slide 20 text

20 Laravel Eloquent $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); routes/web.php $text $tsubuyaki->text text Eloquent artisan

Slide 21

Slide 21 text

21 Laravel Eloquent $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); routes/web.php $text $tsubuyaki->text text save() Eloquent artisan

Slide 22

Slide 22 text

22 Laravel redirect return redirect('tsubuyaki/complete'); routes/web.php

Slide 23

Slide 23 text

23 Laravel redirect return redirect('tsubuyaki/complete'); routes/web.php

Slide 24

Slide 24 text

24 Laravel Route::post('/tsubuyaki', function (Request $request) { $text = $request->text; $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); return redirect('tsubuyaki/complete'); }); routes/web.php

Slide 25

Slide 25 text

25 Laravel Mailer $mailer $mailer->send(new TsubuyakiCreated()); routes/web.php

Slide 26

Slide 26 text

26 Laravel Mailer $mailer $mailer->send(new TsubuyakiCreated()); routes/web.php Mailer DI

Slide 27

Slide 27 text

27 Laravel Mailer $mailer $mailer->send(new TsubuyakiCreated()); routes/web.php Mailer DI Mailable TsubuyakiCreated artisan

Slide 28

Slide 28 text

28 Laravel Route::post('/tsubuyaki', function (Request $request, Mailer $mailer) { $text = $request->text; $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); $mailer->send(new TsubuyakiCreated()); return redirect('tsubuyaki/complete'); }); routes/web.php

Slide 29

Slide 29 text

29 Laravel Route::post('/tsubuyaki', function (Request $request, Mailer $mailer) { $text = $request->text; $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); $mailer->send(new TsubuyakiCreated()); return redirect('tsubuyaki/complete'); }); routes/web.php /tsubuyaki POST function $request->text $text $tsubuyaki->text text save() Mailer DI Mailable TsubuyakiCreated artisan Request DI Eloquent artisan

Slide 30

Slide 30 text

30 Laravel Route::post('/tsubuyaki', function (Request $request, Mailer $mailer) { $text = $request->text; $tsubuyaki = new Tsubuyaki; $tsubuyaki->text = $text; $tsubuyaki->save(); $mailer->send(new TsubuyakiCreated()); return redirect('tsubuyaki/complete'); }); routes/web.php /tsubuyaki POST function $request->text Eloquent $text $tsubuyaki->text text save() Mailer DI Request DI Mailable TsubuyakiCreated artisan

Slide 31

Slide 31 text

31 Laravel • • • Laravel Way 1 •

Slide 32

Slide 32 text

32 Laravel • • • • 範 • Eloquent ActiveRecode • • • •

Slide 33

Slide 33 text

フレームワークとわたしたちのコードの 距離を保つために

Slide 34

Slide 34 text

34 Laravel • • Laravel • Laravel • Laravel • • • Interface

Slide 35

Slide 35 text

35 Laravel Laravel

Slide 36

Slide 36 text

36 class TsubuyakiController extends Controller { public function store(Request $request, Mailer $mailer): RedirectResponse { $text = $request->text; $tsubuyaki = new Tsubuyaki(); $tsubuyaki->text = $text; $tsubuyaki->save(); $mailer->send(new TsubuyakiCreated()); return redirect('tsubuyaki/complete'); } } app/Http/Controllers/TsubuyakiController.php routes/web.php

Slide 37

Slide 37 text

37 Mailer $mailer $mailer->send(new TsubuyakiCreated()); app/Http/Controllers/TsubuyakiController.php Illuminate¥Mail¥Mailer

Slide 38

Slide 38 text

38 app/Http/Controllers/TsubuyakiController.php lib TsubuyakiCreatedSenderInterface namespace Lib¥Mail; interface TsubuyakiCreatedSenderInterface { public function send(): void; } lib/Mail/TsubuyakiCreatedSenderInterface.php

Slide 39

Slide 39 text

39 use Lib¥Mail¥TsubuyakiCreatedSenderInterface as SenderInterface; SenderInterface $sender $sender->send(); app/Http/Controllers/TsubuyakiController.php namespace Lib¥Mail; interface TsubuyakiCreatedSenderInterface { public function send(): void; } lib/Mail/TsubuyakiCreatedSenderInterface.php Interface

Slide 40

Slide 40 text

40 use Lib¥Mail¥TsubuyakiCreatedSenderInterface as SenderInterface; SenderInterface $sender $sender->send(); app/Http/Controllers/TsubuyakiController.php Interface Mailer namespace Lib¥Mail; interface TsubuyakiCreatedSenderInterface { public function send(): void; } lib/Mail/TsubuyakiCreatedSenderInterface.php

Slide 41

Slide 41 text

41 class TsubuyakiCreatedSender implements TsubuyakiCreatedSenderInterface { public function __construct(private readonly Mailer $mailer) {} public function send(): void { $this->$mailer->send(new TsubuyakiCreated()); } } app/Mail/TsubuyakiCreatedSender.php TsubuyakiCreatedSenderInterface app

Slide 42

Slide 42 text

42 class TsubuyakiCreatedSender implements TsubuyakiCreatedSenderInterface { public function __construct(private readonly Mailer $mailer) {} public function send(): void { $this->$mailer->send(new TsubuyakiCreated()); } } app/Mail/TsubuyakiCreatedSender.php class AppServiceProvider extends ServiceProvider { public array $bindings = [ Lib¥Mail¥TsubuyakiCreatedSenderInterface::class => ¥App¥Mail¥TsubuyakiCreatedSender::class, ]; } app/Providers/AppServiceProvider.php

Slide 43

Slide 43 text

43 use Lib¥Mail¥TsubuyakiCreatedSenderInterface as SenderInterface; class TsubuyakiController extends Controller { public function store(Request $request, SenderInterface $sender): RedirectResponse { $text = $request->text; $tsubuyaki = new Tsubuyaki(); $tsubuyaki->text = $text; $tsubuyaki->save(); $sender->send(); return redirect('tsubuyaki/complete'); } } app/Http/Controllers/TsubuyakiController.php

Slide 44

Slide 44 text

44 $tsubuyaki = new Tsubuyaki(); $tsubuyaki->text = $text; $tsubuyaki->save(); app/Http/Controllers/TsubuyakiController.php Eloquent

Slide 45

Slide 45 text

45 app/Http/Controllers/TsubuyakiController.php namespace Lib¥Tsubuyaki; interface TsubuyakiUseCaseInterface { public function save(string $text): void; } lib/Tsubuyaki/TsubuyakiUseCaseInterface.php lib TsubuyakiUseCaseInterface

Slide 46

Slide 46 text

46 ; use Lib¥Tsubuyaki¥TsubuyakiUseCaseInterface; TsubuyakiUseCaseInterface $useCase $useCase->save($text); app/Http/Controllers/TsubuyakiController.php namespace Lib¥Tsubuyaki; interface TsubuyakiUseCaseInterface { public function save(string $text): void; } lib/Tsubuyaki/TsubuyakiUseCaseInterface.php Interface Eloquent

Slide 47

Slide 47 text

47 class TsubuyakiUseCase implements TsubuyakiUseCaseInterface { public function save(string $text): void { $tsubuyaki = new Tsubuyaki(); $tsubuyaki->text = $text; $tsubuyaki->save(); } } app/Tsubuyaki/TsubuyakiUseCase.php TsubuyakiUseCaseInterface app

Slide 48

Slide 48 text

48 class TsubuyakiUseCase implements TsubuyakiUseCaseInterface { public function __construct(private readonly EntityManager $em) {} public function save(string $text): void { $tsubuyaki = new Tsubuyaki(); $tsubuyaki->setText($text); $em->persist($tsubuyaki); $em->flush(); } } app/Tsubuyaki/TsubuyakiUseCase.php Doctrine

Slide 49

Slide 49 text

49 Interface • • app Laravel • lib Laravel • Laravel app • lib • • DB

Slide 50

Slide 50 text

50 1 • lib Doctrine • Doctrine ORM Eloquent • Doctrine • • Eloquent DB

Slide 51

Slide 51 text

51 2 1 • • • UseCase Service • • DI •

Slide 52

Slide 52 text

52 3 2 • • Mailgun SendGrid • Interface • MailerResolver • • MailerResolver • • 1

Slide 53

Slide 53 text

53 • Laravel Way • • PoC • • • • •

Slide 54

Slide 54 text

54 • • SOLID etc • • • •

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

56 • Laravel • Laravel PHP • [ ] • Laravel • Facade Eloquent • • • Interface • •