Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Laravel × Clean Architecture 新規開発中の現場

Ian Brison
December 01, 2019

Laravel × Clean Architecture 新規開発中の現場

「クリーンアーキテクチャ」とは、DDDの文脈における「ドメインモデル」をシステムの中心にすえ、「入力」「永続」「出力」などの多方面で抽象化を行うことで、高度に変化への強さを獲得できるアーキテクチャです。昨今の変化の早さに対応するべく「アジャイル開発」や「マイクロサービス」が叫ばれているように、「クリーンアーキテクチャ」もまた日増しにその注目度は上がっているように感じます。

しかし、やや取っつきにくいアーキテクチャであることからか、現状参考になる資料が無数に転がっているというわけでもありません。そこで、エキテンで現在Laravelベースで開発中の新しい予約システムを題材に、実際にアーキテクチャを形作っているコンポーネントの紹介や、開発する上で行ってみたちょっとした工夫、開発フェーズにおける現場の生の声などをお話しようと思います。

Ian Brison

December 01, 2019
Tweet

Other Decks in Programming

Transcript

  1. Laravel
    ×
    Clean Architecture

    Twitter: @brison_ian
    ~
    ~

    View Slide

  2. LaravelClean Architecture
    ...
    2019/11/30

    View Slide

  3. &2019/11/30 !"#'

    Twitter: @nrslib

    Twitter: @okashoi
    2$
    %

    View Slide




  4. View Slide

  5. $'*!)

    $% " &#
    *! (

    View Slide



  6. 1. )'
    2. (!&+-$
    *#.
    3. ,

    4. %
    5.
    6. "

    View Slide


  7. View Slide

  8. & $23%
    #&
    &

    &
    !"&
    Twitter&@brison_ian

    View Slide



  9. View Slide

  10. )! '/2-
    ("
    DB
    1

    $0 /DB
    /.*,3
    ("
    +,3
    /API
    %DB&*
    #

    View Slide

  11. ,$*!260
    +%
    DB
    4

    '3 !2DB
    !21-/7
    +%
    #./7
    !2API
    "(DB
    )-
    !&

    5

    View Slide


  12. 10

    View Slide


  13. 10

    View Slide

  14. 10

    8

    View Slide


  15. 1 + 3

    View Slide

  16. "# 1 + 3
    !



    1

    View Slide

  17. 9:6511 + )431
    0% )434"!
    +'0(/8"
    31*&6"


    82
    !7$)4
    65,-#.

    1" 65

    View Slide


  18. View Slide

  19. *0.M
    g1I^]a
    c?;
    MF[MQ*0.:8e_bA!
    3GW4GW4C
    fU>T#A

    View Slide


  20. View Slide


  21. : https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

    View Slide


  22. Entity
    Value
    Object
    Domain
    Service
    Repository Gateway
    UseCase
    UseCase
    Input
    UseCase
    Output
    Converter
    Presenter
    ViewModel
    Dao
    Request
    Response
    Eloquent
    Database
    Manager
    AppService
    Provider
    Controller

    View Slide


  23. 18
    Entity
    Value
    Object
    Domain
    Service
    Repository Gateway
    UseCase
    UseCase
    Input
    UseCase
    Output
    Converter
    Presenter
    ViewModel
    Dao
    Request
    Response
    Eloquent
    Database
    Manager
    AppService
    Provider
    Controller
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12 13
    14
    15
    16
    17 18

    View Slide

  24. 5Laravel
    Entity
    Value
    Object
    Domain
    Service
    Repository Gateway
    UseCase
    UseCase
    Input
    UseCase
    Output
    Converter
    Presenter
    ViewModel
    Dao
    Request
    Response
    Eloquent
    Database
    Manager
    AppService
    Provider
    Controller

    View Slide



  25. 1,2


    3,4

    View Slide


  26. View Slide

  27. Entity
    Value
    Object
    Domain
    Service
    Model

    View Slide

  28. View Slide

  29. 8B0<5;0<5101<5+)
    3/61

    @,79
    4:?->
    & $'%"#2
    &!$
    A(=
    value()D;*C.


    View Slide

  30. Entity
    ● M5;PIDQE%)'!"7,(
    ● Value ObjectG83KF>H
    ● Entity. )$ #/<9+-0&*/
    A
    P1 +-0&*/BLQ
    ● IC:7?NUseCase4O=
    +-0&*/ [email protected]
    DH

    View Slide

  31. Entity
    !
    ""#
    $ Void

    View Slide

  32. ● Model58."+*.C& %!-/-GI

    ● F>;?H2ModelJ(,
    )#'6K

    View Slide

  33. B+?executeG;.0=
    6D+
    ' : F-A58
    +H6
    Domain Service.,Domain Service
    4OK
    I* $'! *&*
    # !%(#J

    )"@21/3
    >9F-A5C7 E

    View Slide

  34. Repository
    UseCase
    UseCase
    Input
    UseCase
    Output
    Service

    View Slide

  35. Repository

    ● Interface
    ● Entity

    View Slide

  36. Entity"=Value Object
    7
    ! *6
    :"=% #NG
    EntityA
    >&B


    6/54$9update(Menu $menu)
    ?3 -),

    ;:'+(@
    8
    1EntityA
    >&B.3
    5402#*6void

    View Slide

  37. ● ,0+ ("#
    ● Interface&.
    ● Value Object$!
    ● )-*,Clean Architecture'/%

    UseCaseInput

    View Slide

  38. $-UseCase
    "*

    )+(%!&!
    #'int
    string,

    View Slide

  39. UseCaseOutput
    ● #(*8?7 !"'=,-
    ● +,- Interface1;@ :3Interface

    A
    ● Entity 04 Value Object%)&"$.
    ● 5968Clean Architecture2>/

    View Slide





  40. View Slide

  41. !%


    UseCaseOutput
    Interface#
    $
    !%
    "

    !%

    View Slide

  42. UseCase
    ● )$#"'(&( 03
    ● !%5.*
    ● UseCaseInput12UseCaseOutput6,


    ● RepositoryDomainService+/4
    7-("' (&(

    View Slide

  43. Domain Service
    execute


    Domain Service
    Repository

    View Slide

  44. *>#
    34;217UseCase
    /
    6-;
    UseCase
    ,
    1. Repository&+
    2. Repository&+
    3. Domain Service*9
    4. Domain Service*9
    5. Entity5.'$
    6. Repository 21
    7. UseCaseOutput"()8
    execute=0!:

    View Slide

  45. Gateway
    Converter
    Presenter
    ViewModel Dao
    Adapter

    View Slide

  46. Gateway
    ● Repository!Implements
    ● @S/:-+0"3.2: B/:-!
    14#95/8?EP=
    ● R14#95/8!3.2:?E /:-+0"
    QM
    ● @S"%,+Dao!

    View Slide

  47. ( ,3Dao+
    /-2)

    DI
    *0
    Eloquent ORM
    #"(
    !$'%&
    1.

    View Slide

  48. *8;:1/A #($
    '"!)29

    &(%([email protected]
    0Gateway-3>4?
    Dao
    Delete Insert
    [email protected],=
    +7 ...

    View Slide

  49. Dao
    ● (%
    ● #
    Eloquent Model&)!'
    DatabaseManager*%
    ● API$" Guzzle

    View Slide

  50. Eloquent Model


    DatabaseManager

    View Slide

  51. Converter
    ● UseCaseInputImplements
    ● ;

    View Slide

  52. /0-5&+
    (
    2
    $ #,$!%$
    DI

    HTTP430')
    "$1')
    *.

    View Slide

  53. Presenter
    ● UseCaseOutput68 5
    4231=?
    ● HTML.JSON.*% ,!'.)/+.-".Console23#$
    &(:>
    2397
    ● 230;

    View Slide


  54. execute

    View Slide

  55. Presenter!
    ViewModel
    JsonPresenter
    JsonViewModel


    View Slide

  56. ViewModel

    ● Humble Object

    View Slide

  57. JsonViewModel


    JSON

    toArray

    View Slide



  58. Json

    blade

    View Slide

  59. JsonPresenter

    JsonViewModel




    {
    “id” => 3,
    “name” => “aaa”,
    “settings” => {
    “key” => “value”,

    }
    }

    View Slide

  60. Humble Object




    View Slide


  61. JSON

    HTMLUI
    !"


    View Slide

  62. ViewModel'*
    &
    &+( "$%
    !$#)%
    Humble
    Object%$,

    View Slide



  63. Entity
    Value
    Object
    Domain
    Service
    Repository Gateway
    UseCase
    UseCase
    Input
    UseCase
    Output
    Converter
    Presenter
    ViewModel
    Dao
    Request
    Response
    Eloquent
    Database
    Manager
    AppService
    Provider
    Controller

    View Slide


  64. Entity
    Value
    Object
    Domain
    Service
    Repository Gateway
    UseCase
    UseCase
    Input
    UseCase
    Output
    Converter
    Presenter
    ViewModel
    Dao
    Request
    Response
    Eloquent
    Database
    Manager
    AppService
    Provider
    Controller

    View Slide

  65. Controller
    Application

    View Slide

  66. ● ApplicationJ#W&ControlnCRo$kG
    ● K[c'*-7:6/03ConverterUseCase
    Presenter^MNh&h
    ● @?Aa&$H

    View Slide

  67. "&* 2,
    )Converter, UseCase, Presenter
    ($,,
    !#Laravel'+

    %*-(

    View Slide

  68. AppServiceProvider





    View Slide

  69. .=1 '49+8
    3-
    Laravel Middleware*=
    ;>2
    )%$
    UseCase
    .=06!%(#'/
    '& "' 7:
    ,5

    View Slide



  70. View Slide

  71. RoutingController

    Controller!


    1. Application

    View Slide

  72. '% RoutingController

    4+
    'Controller>, 7:,6
    2;
    1. Application=-
    'Controller$!
    15*09 "&&.
    &&(3
    'UseCase/;8)2
    ;
    2. Action Method/;

    View Slide

  73. +)$RoutingController
    90
    +ControllerD1 1;
    [email protected]
    1. ApplicationB2
    +Controller(*' "%
    6:/5> &*#*3
    *!*,8
    [email protected]=-7A
    @
    2. Action [email protected]
    +UseCaseInputUseCase
    executeE:[email protected]
    +UseCaseOutputC

    3. [email protected]

    View Slide

  74. /- #(RoutingController
    >5
    /[email protected]

    View Slide

  75. View Slide



  76. View Slide

  77. ;1M5F%&(
    [email protected]'-*XLX?NB2H3!G
    ● O4

    View Slide

  78. NWYP
    ● ;X>"4,'A
    YP
    !0%8
    &(
    ● YPYF17M<9-815GTEDB
    OYPfaker"=CZ YP
    ● ;@RU.3$6I9RU#*2)8IHV
    B?L.3$6IHV/,+:SHV
    B?L JKHVQD0%8&(

    View Slide


  79. View Slide

  80. '.>73:(/ ,+
    ● LaravelArtisan!*0$'.3:!*0$3
    ● 2,3;?324-#10!"%A
    B
    @93:C8
    7D
    Controller!&)=
    56

    View Slide

  81. PHPStan/LaraStanPhan;N
    ● JWE#=$YOTK
    Clean Architecture
    GLI 9I

    (8+1,/5&#*82
    ● PhanMFcomposer.json&UV
    Phan24)7C
    TK&
    ● LaraStancomposer.json&UV'24)7CA
    (.3-8CTK>N
    ● PhpStanLaraStan!#P(.3-8CLaravelQTK
    PhanS$24)7CTK& "
    ● ZS# $9086B: $RDXLI
    @#
    &LIH %$
    ?[

    View Slide


  82. View Slide

  83. ● 07'528'/5+&3_ I"!CB
    ,:3USLV!!ZE]H$K,
    468)R!
    ● ;N%I"O? #1&.*A ^ !a
    XPb`"`[email protected][

    ● Clean Architecture;WY=$XM!>D9JFQc(*-3!T\

    View Slide



  84. View Slide