Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

1

Share

クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai

Download to read offline

※この発表は
 ・PHP カンファレンス北海道 2019(https://www.slideshare.net/ShoheiOkada/laravel-phpcondo)
 ・PHP カンファレンス沖縄 2019(https://www.slideshare.net/ShoheiOkada/laravel-phpconokinawa)
での発表を 15 分にまとめたものです。

最近、設計に対する関心高まりを感じています。
その一方で「名前は聞いたことあるけど、敷居が高そう......」「本は読んだけど実際に実装するイメージがつかない......」と感じている方もいらっしゃるのではないでしょうか?
本セッションでは設計に関するテーマとして「クリーンアーキテクチャ」を扱い、セッション前半ではクリーンアーキテクチャのコアとなる考え方を説明します。
後半では「フレームワーク非依存」を謳うクリーンアーキテクチャの考え方を、Laravelのプロジェクトに適用する方法を提案します。

2019/11/13 開催の「【シューマイ】Tech Lead Engineerから最新技術を学べ!Laravel編」 (https://shuuu-mai.connpass.com/event/152080/) の発表資料です。

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

クリーンアーキテクチャの考え方にもとづく Laravel との付き合い方 #shuuumai

  1. 1. Laravel Tech Lead Engineer Laravel @okashoi WILLGATE, Inc.
  2. 2. • • 🙆 • • #shuuumai 2
  3. 3. ※ • PHP 2019 2019/09/21 • PHP 2019 2019/10/12 15 3
  4. 4. • 1 • 5 • Laravel 5 • 1 • 3 4
  5. 5. • 1 • 5 • Laravel 5 • 1 • 3 5
  6. 6. 🏁 • • Laravel 6
  7. 7. 🙅 • • Laravel • 7
  8. 8. • 1 • 5 • Laravel 5 • 1 • 3 8
  9. 9. 2012 ”The Clean Architecture - The Clean Code Blog”, https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html 9
  10. 10. 10 2017 2018
  11. 11. 11
  12. 12. 12
  13. 13. 13 🙅
  14. 14. • Enterprise Business Rules • • • Application Business Rules • 14
  15. 15. https://little-hands.hatenablog.com/entry/2019/07/26/ domain-knowledge 15
  16. 16. 16
  17. 17. 17 ↑
  18. 18. 18
  19. 19. package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 19 package bar; class Bar { function process() { // do something... } }
  20. 20. package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 20 package bar; class Bar { function process() { // do something... } } foo bar = foo → bar
  21. 21. package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 21 package bar; class Bar { function process() { // do something... } } foo bar = foo → bar
  22. 22. package foo; import bar; class Foo { bar.Bar x; function doFoo() { x.process(); } } 22 package bar; class Bar { function process() { // do something... } } foo → bar foo → bar
  23. 23. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 23 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }
  24. 24. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 24 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }
  25. 25. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 25 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } foo bar = foo → bar
  26. 26. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 26 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } bar foo = foo ← bar
  27. 27. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 27 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } } foo → bar foo ← bar
  28. 28. = 28
  29. 29. “ 
 
 ” 29
  30. 30. • 
 ➡ 
 30
  31. 31. 31 UI
  32. 32. • 1 • 5 • Laravel 5 • 1 • 3 32
  33. 33. Laravel • DI • Eloquent 33
  34. 34. Laravel • 
 Service Provider • Laravel 
 34
  35. 35. Laravel • 
 Service Provider • Laravel 
 35
  36. 36. @Laravel JP Conference 2019 https://speakerdeck.com/mikakane/laravel-package- development 36
  37. 37. 37 packages 

  38. 38. Service Provider • • 
 • = • = 38
  39. 39. Service Provider 39 class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->bind(IdProvider::class, AutoIncrementTaskIdProvider::class); $this->app->bind(TaskRepositoryInterface::class, TaskRepository::class); }
  40. 40. Service Container 
 40 /** * Interactor constructor. * @param IdProvider $idProvider * @param TaskRepository $taskRepository * @param NormalOutputBoundary $normalOutputBoundary */ public function __construct(IdProvider $idProvider, TaskRepository $taskRepository, … { $this->idProvider = $idProvider; $this->taskRepository = $taskRepository; $this->normalOutputBoundary = $normalOutputBoundary; }
  41. 41. Laravel • 
 Service Provider • Laravel 
 41
  42. 42. 42
  43. 43. • • 
 • 
 43
  44. 44. 44 <?php namespace MyAppComponentsCreateInboxUseCase; use MyAppEntitiesTask{Task, Id}; /** * Interface TaskRepository * @package MyAppComponentsCreateInboxUseCase */ interface TaskRepository { /** * 与えられたタスクを永続化する * * @param Task $task */ public function save(Task $task): void;
  45. 45. Web UI 45
  46. 46. Web UI • • 🙆 • Eloquent 46
  47. 47. <?php namespace MyAppComponentsCreateInboxDataAccessDatabaseRepositories; // 略 /** * Class TaskRepository * @package MyAppComponentsCreateInboxDataAccessDatabaseRepositories */ class TaskRepository implements TaskRepositoryInterface { /** * 与えられたタスクを永続化する * * @param Task $task */ public function save(Task $task): void { $taskRecord = EloquentsTask::create([ 'name' => $task->name()->value(), 'note' => $task->note()->value(), ]); 47
  48. 48. <?php namespace MyAppComponentsCreateInboxDataAccessDatabaseRepositories; // 略 /** * Class TaskRepository * @package MyAppComponentsCreateInboxDataAccessDatabaseRepositories */ class TaskRepository implements TaskRepositoryInterface { /** * 与えられたタスクを永続化する * * @param Task $task */ public function save(Task $task): void { $taskRecord = EloquentsTask::create([ 'name' => $task->name()->value(), 'note' => $task->note()->value(), ]); Eloquent 48
  49. 49. “ 
 
 
 
 ” 49
  50. 50. WIP https://github.com/okashoi/laravel-clean- architecture • • • 50
  51. 51. • 1 • 5 • Laravel 5 • 1 • 3 51
  52. 52. 52 UI
  53. 53. package foo; class Foo { Buz x; function doFoo() { x.process(); } } interface Buz { function process(); } 53 package bar; import foo; class Bar implements foo.Buz { function process() { // do something... } }
  54. 54. Laravel • 
 Service Provider • Laravel 
 54
  55. 55. • 1 • 5 • Laravel 5 • 1 • 3 55
  56. 56. / @okashoi @okashoi 56
  57. 57. 57
  58. 58. 58
  59. 59. Laravel.shibuya #5 59
  60. 60. Laravel JP Conference 2020 60
  61. 61. / @okashoi @okashoi 61 😄
  • yuzupi

    Nov. 13, 2019

※この発表は  ・PHP カンファレンス北海道 2019(https://www.slideshare.net/ShoheiOkada/laravel-phpcondo)  ・PHP カンファレンス沖縄 2019(https://www.slideshare.net/ShoheiOkada/laravel-phpconokinawa) での発表を 15 分にまとめたものです。 最近、設計に対する関心高まりを感じています。 その一方で「名前は聞いたことあるけど、敷居が高そう......」「本は読んだけど実際に実装するイメージがつかない......」と感じている方もいらっしゃるのではないでしょうか? 本セッションでは設計に関するテーマとして「クリーンアーキテクチャ」を扱い、セッション前半ではクリーンアーキテクチャのコアとなる考え方を説明します。 後半では「フレームワーク非依存」を謳うクリーンアーキテクチャの考え方を、Laravelのプロジェクトに適用する方法を提案します。 2019/11/13 開催の「【シューマイ】Tech Lead Engineerから最新技術を学べ!Laravel編」 (https://shuuu-mai.connpass.com/event/152080/) の発表資料です。

Views

Total views

2,548

On Slideshare

0

From embeds

0

Number of embeds

65

Actions

Downloads

2

Shares

0

Comments

0

Likes

1

×