Laravel × Clean Architecture 新規開発中の現場
by
Ian Brison
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Laravel × Clean Architecture Twitter: @brison_ian ~ ~
Slide 2
Slide 2 text
LaravelClean Architecture ... 2019/11/30
Slide 3
Slide 3 text
&2019/11/30 !"#' Twitter: @nrslib Twitter: @okashoi 2$ %
Slide 4
Slide 4 text
Slide 5
Slide 5 text
$'*!) $% " &# *! (
Slide 6
Slide 6 text
1. )' 2. (!&+-$ *#. 3. , 4. % 5. 6. "
Slide 7
Slide 7 text
Slide 8
Slide 8 text
& $23% #& & & !"& Twitter&@brison_ian
Slide 9
Slide 9 text
Slide 10
Slide 10 text
)! '/2- (" DB 1 $0 /DB /.*,3 (" +,3 /API %DB&* #
Slide 11
Slide 11 text
,$*!260 +% DB 4 '3 !2DB !21-/7 +% #./7 !2API "(DB )- !& 5
Slide 12
Slide 12 text
10
Slide 13
Slide 13 text
10
Slide 14
Slide 14 text
10 8
Slide 15
Slide 15 text
1 + 3
Slide 16
Slide 16 text
"# 1 + 3 ! 1
Slide 17
Slide 17 text
9:6511 + )431 0% )434"! +'0(/8" 31*&6" 82 !7$)4 65,-#. 1" 65
Slide 18
Slide 18 text
Slide 19
Slide 19 text
*0.M g1I^]a c?; MF[MQ*0.:8e_bA! 3GW4GW4C fU>T#A
Slide 20
Slide 20 text
Slide 21
Slide 21 text
: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
Slide 22
Slide 22 text
Entity Value Object Domain Service Repository Gateway UseCase UseCase Input UseCase Output Converter Presenter ViewModel Dao Request Response Eloquent Database Manager AppService Provider Controller
Slide 23
Slide 23 text
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
Slide 24
Slide 24 text
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
Slide 25
Slide 25 text
1,2 3,4
Slide 26
Slide 26 text
Slide 27
Slide 27 text
Entity Value Object Domain Service Model
Slide 28
Slide 28 text
● ;= ● ?1@:3 '+("&7%$ ,.,4 DF0 ● Value Object68E5 9Value Object/ ● I2)#+-AH C ● (*.!&, Value Object
Slide 29
Slide 29 text
8B0<5;0<5101<5+) 3/61 @,79 4:?-> & $'%"#2 &!$ A(= value()D;*C.
Slide 30
Slide 30 text
Entity ● M5;PIDQE%)'!"7,( ● Value ObjectG83KF>H ● Entity. )$ #/<9+-0&*/ A P1 +-0&*/BLQ ● IC:7?NUseCase4O= +-0&*/ 62J@ DH
Slide 31
Slide 31 text
Entity ! ""# $ Void
Slide 32
Slide 32 text
● Model58."+*.C& %!-/-GI ● F>;?H2ModelJ(, )#'6K ●
Slide 33
Slide 33 text
B+?executeG;.0= 6D+ ' : F-A58 +H6 Domain Service.,Domain Service 4OK I* $'! *&* # !%(#J )"@9F-A5C7 E
Slide 34
Slide 34 text
Repository UseCase UseCase Input UseCase Output Service
Slide 35
Slide 35 text
Repository ● ● Interface ● Entity
Slide 36
Slide 36 text
Entity"=Value Object 7 ! *6 :"=% <#NG EntityA >&B< 6/54$9update(Menu $menu) ?3 -), ;:'+(@ 8 1EntityA >&B.3 5402#*6void
Slide 37
Slide 37 text
● ,0+ ("# ● Interface&. ● Value Object$! ● )-*,Clean Architecture'/% UseCaseInput
Slide 38
Slide 38 text
$-UseCase "* )+(%!&! #'int string,
Slide 39
Slide 39 text
UseCaseOutput ● #(*8?7 !"'=,- ● +,- Interface1;@ :3Interface A ● Entity 04 Value Object%)&"$.< ● 5968Clean Architecture2>/
Slide 40
Slide 40 text
Slide 41
Slide 41 text
!% UseCaseOutput Interface# $ !% " !%
Slide 42
Slide 42 text
UseCase ● )$#"'(&( 03 ● !%5.* ● UseCaseInput12UseCaseOutput6, ● RepositoryDomainService+/4 7-("' (&(
Slide 43
Slide 43 text
Domain Service execute Domain Service Repository
Slide 44
Slide 44 text
*># 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!:
Slide 45
Slide 45 text
Gateway Converter Presenter ViewModel Dao Adapter
Slide 46
Slide 46 text
Gateway ● Repository!Implements ● @S/:-+0"3.2: B/:-! 14#95/8?EP= ● R14#95/8!3.2:?E /:-+0" QM ● @S"%,+Dao!
Slide 47
Slide 47 text
( ,3Dao+ /-2) DI *0 Eloquent ORM #"( !$'%& 1.
Slide 48
Slide 48 text
*8;:1/A #($ '"!)29 &(%(.56@ 0<Gateway-3>4? Dao Delete Insert 6@,= +7 ...
Slide 49
Slide 49 text
Dao ● (% ● # Eloquent Model&)!' DatabaseManager*% ● API$" Guzzle
Slide 50
Slide 50 text
Eloquent Model DatabaseManager
Slide 51
Slide 51 text
Converter ● UseCaseInputImplements ● ;Web "$'LaravelRequest+"%*# +! )+ =&(+-.48 ● Console5@ Console=Converter, ● 9?:>Clean ArchitectureLaravelRequest7A0 @
Slide 52
Slide 52 text
/0-5&+ ( 2 $ #,$!%$ DI HTTP430') "$1') *.
Slide 53
Slide 53 text
Presenter ● UseCaseOutput68 5 4231=? ● HTML.JSON.*% ,!'.)/+.-".Console23#$ &(:> 239<7 ● 230;
Slide 54
Slide 54 text
execute
Slide 55
Slide 55 text
Presenter! ViewModel JsonPresenter JsonViewModel
Slide 56
Slide 56 text
ViewModel ● ● Humble Object
Slide 57
Slide 57 text
JsonViewModel JSON toArray
Slide 58
Slide 58 text
Json blade
Slide 59
Slide 59 text
JsonPresenter JsonViewModel { “id” => 3, “name” => “aaa”, “settings” => { “key” => “value”, … } }
Slide 60
Slide 60 text
Humble Object
Slide 61
Slide 61 text
JSON HTMLUI !"
Slide 62
Slide 62 text
ViewModel'* & &+( "$% !$#)% Humble Object%$,
Slide 63
Slide 63 text
Entity Value Object Domain Service Repository Gateway UseCase UseCase Input UseCase Output Converter Presenter ViewModel Dao Request Response Eloquent Database Manager AppService Provider Controller
Slide 64
Slide 64 text
Entity Value Object Domain Service Repository Gateway UseCase UseCase Input UseCase Output Converter Presenter ViewModel Dao Request Response Eloquent Database Manager AppService Provider Controller
Slide 65
Slide 65 text
Controller Application
Slide 66
Slide 66 text
● ApplicationJ#W&ControlnCRo$kG ● K[c'*-7:6/03ConverterUseCase Presenter^MNh&h ● @?Aa&$H_SNhX,:1).2TFc\g nDIo&B#Y$ \gFcU&dQeVl 36(:Pi`D fH= "$] $ ● UseCaseNhO'58+;-7:_Z Aa&E"%$ Controller
Slide 67
Slide 67 text
"&* 2, )Converter, UseCase, Presenter ($,, !#Laravel'+ %*-(
Slide 68
Slide 68 text
AppServiceProvider
Slide 69
Slide 69 text
.=1 '49+8 3<- Laravel Middleware*= ;>2 )%$ UseCase .=06!%(#'/ '& "' 7: ,5
Slide 70
Slide 70 text
Slide 71
Slide 71 text
RoutingController Controller! 1. Application
Slide 72
Slide 72 text
'% RoutingController 4+ 'Controller>, 7:,6 2<; 1. Application=- 'Controller$&#! 15*09 "&&. &&(3 'UseCase/;8)2< ; 2. Action Method/;
Slide 73
Slide 73 text
+)$RoutingController 90 +ControllerD1 &*#*3 *!*,8 +UseCase4@=-7A @ 2. Action Method4@ +UseCaseInputUseCase executeE:.4@ +UseCaseOutputC 3. UseCase4@
Slide 74
Slide 74 text
/- #(RoutingController >5 /ControllerI6AD6@
Slide 75
Slide 75 text
No content
Slide 76
Slide 76 text
Slide 77
Slide 77 text
;1M5F%&( ● 5@U'-*XLX?NB2H3!G ● O4<:XLX?.,EBR"! XL330DV! YTWB8A /9C Z ● IJ)#$+ >6Q >S7=K 4B8 &$&$@P
Slide 78
Slide 78 text
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&(
Slide 79
Slide 79 text
Slide 80
Slide 80 text
'.>73:(/ ,+ ● LaravelArtisan!*0$'.3:!*0$3 ● 2,3;?3<24-#10!"%A B @93:C8 7D Controller!&)= 56
Slide 81
Slide 81 text
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 %$ ?[
Slide 82
Slide 82 text
Slide 83
Slide 83 text
● 07'528'/5+&3_ I"!CB ,:3USLV!!ZE]H$K, 468)R! ● ;N%I"O? #1&.*A ^ !a XPb`"`G@[ ● Clean Architecture;WY=$XM!>D9JFQc
Slide 84
Slide 84 text