1. ã¯ããã«
ã¿ãªãããLaravelã§éçºãé²ããäžã§ã
ãFormRequestã®ããªããŒã·ã§ã³ã«ãŒã«ãã©ãã©ãå¢ããŠèŠéããæªãâŠã
ãRequestãšAPI Resourceã§ãçµå±åããããªããããã£ãäœåºŠãå®çŸ©ããŠããâŠã
ãé åã§ããŒã¿ãæ±ã£ãŠããŠãã©ããªããŒãååšããã®ãåããã«ããïŒã
ãšãã£ãæ©ã¿ãæ±ããããšã¯ãããŸãããïŒ
ãããã®èª²é¡ãã¹ããŒãã«è§£æ±ºããŠãããã®ããSpatie補ã®åŒ·åãªDTOïŒData Transfer ObjectïŒããã±ãŒãžlaravel-dataã§ãïŒ
æ¬èšäºã§ã¯ãlaravel-dataã®åºæ¬çãªåœ¹å²ã解説ããããã«å®æ¡ä»¶ã§æŽ»çšããŠæãããªã¢ã«ãªã¡ãªããã»ãã¡ãªãããå
±æããŸãïŒ
2. laravel-dataãšã¯ïŒ
https://github.com/spatie/laravel-data
laravel-dataã¯ãã¢ããªã±ãŒã·ã§ã³å
ã§ããåããããããŒã¿ããäžè²«æ§ã®ããæ§é åããããªããžã§ã¯ãïŒDTOïŒãšããŠæ±ãããã®ããã±ãŒãžã§ãã
åŸæ¥ã®éçºã§ã¯ããªã¯ãšã¹ãã®å ¥åå€ãããŒã¿ããŒã¹ããååŸããå€ãªã©ãã飿³é åã®ãŸãŸæ±ã£ãŠããŸããã§ãããïŒ
laravel-dataã¯ããããã®ãã©ãã©ãªããŒã¿ãå
¥ããããã®ãåå®å
šãªãå°çšã®ç®±ããçšæãããããªãã®ã§ãã
ãã®ãå°çšã®ç®±ïŒDataãªããžã§ã¯ãïŒãã¯ãåã«ããŒã¿ãæã€ã ãã§ãªããèªåèªèº«ã®ããªããŒã·ã§ã³æ¹æ³ãç¥ã£ãŠãããAPIã¬ã¹ãã³ã¹ãšããŠæé©ãªåœ¢ã«èªåã§å€èº«ããããšãã§ããŸãã
ããã«ãããããŒã¿ã®å ¥ãå£ïŒRequestïŒããåºå£ïŒResponseïŒãŸã§ãäžè²«ãããªããžã§ã¯ãã§å®å šã«ããŒã¿ãæ±ãããšãå¯èœã«ãªããŸãã
3. laravel-dataã®äž»èŠãªåœ¹å²
laravel-dataã¯ãLaravelæšæºã®ããã€ãã®æ©èœããããã¢ãã³ã§éçŽããã圢ã«çœ®ãæããŸãã
- DTO (Data Transfer Object) ãªã¯ãšã¹ããã¢ãã«ãé åãªã©ãæ§ã ãªããŒã¿ãœãŒã¹ããåå®å šãªãªããžã§ã¯ããç°¡åã«äœæã§ããŸããããã«ãããã¡ãœããã®åŒæ°ãªã©ã§å宣èšã䜿ããããã«ãªããã³ãŒãã®ä¿¡é Œæ§ãåäžããŸãã
- FormRequestã®ä»£æ¿ Dataãªããžã§ã¯ãå
ã«çŽæ¥ããªããŒã·ã§ã³ã«ãŒã«ãå®çŸ©ã§ããŸããããã«ããã
FormRequestã¯ã©ã¹ãå¥éäœæããå¿ èŠããªããªããããŒã¿å®çŸ©ãšããªããŒã·ã§ã³ããžãã¯ã1ç®æã«éçŽã§ããŸãã - API Resourceã®ä»£æ¿ Dataãªããžã§ã¯ããã³ã³ãããŒã©ããçŽæ¥è¿åŽãããšãèªåçã«JSON圢åŒã«å€æãããŸããããã«ããã
API Resourceã¯ã©ã¹ãäœæããæéãçãã€ã€ãã¬ã¹ãã³ã¹ã®åœ¢åŒãã³ã³ãããŒã«ã§ããŸãã
4. ããŒã¿ãããŒã§çè§£ããlaravel-dataã®åœ¹å²
å
žåçãªããªã¯ãšã¹ããåãåããJSONãè¿ããAPIã®åŠçã®æµãã§ãlaravel-dataãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
1. UIå±€ (Controller): ãªã¯ãšã¹ãã®å ¥ãå£
ã³ã³ãããŒã©ã®ã¡ãœããã®åŒæ°ã§ãäœæããPostDataã®ããã«Dataãªããžã§ã¯ããå宣èšããŸãã laravel-dataãè£åŽã§ãªã¯ãšã¹ãå
容ããPostDataãªããžã§ã¯ããçæããåæã«å®çŸ©ãããããªããŒã·ã§ã³ã«ãŒã«ãå®è¡ããŸãããã®æç¹ã§FormRequestã®åœ¹å²ã¯å®äºã§ãã
// PostDataã¯ã©ã¹ããªã¯ãšã¹ãã®ããªããŒã·ã§ã³ãšDTOãžã®å€æãèªåã§è¡ã
public function store(PostData $postData)
{
// ...
}2. ããžãã¹ããžãã¯å±€ (Service / Action)
ã³ã³ãããŒã©ãããããªããŒã·ã§ã³æžã¿ã®$postDataãªããžã§ã¯ãããµãŒãã¹å±€ã«æž¡ããŸãã ãµãŒãã¹å±€ã§ã¯ã$postData->title ã®ããã«ããããã£ã«å®å
šã«ã¢ã¯ã»ã¹ã§ããIDEã®è£å®ãå¹ãããéçºäœéšãåäžããŸããããé
åã®ããŒãæ°ã«ããå¿
èŠã¯ãããŸããã
3. UIå±€ (Controller): ã¬ã¹ãã³ã¹ã®åºå£
åŠççµæãPostDataãªããžã§ã¯ãïŒãŸãã¯ãã®CollectionïŒã®ãŸãŸã³ã³ãããŒã©ããè¿ããŸãã laravel-dataãèªåã§ãªããžã§ã¯ããJSONã«ã·ãªã¢ã©ã€ãºããŠããããããAPI Resourceãä»ããã«ãæŽåœ¢ãããAPIã¬ã¹ãã³ã¹ãè¿ãããšãã§ããŸãã
public function show(Post $post)
{
// Eloquentã¢ãã«ããDataãªããžã§ã¯ããçæãããã®ãŸãŸè¿ã
return PostData::from($post);
}5. 宿¡ä»¶ã§æããã¡ãªãã
- 責åã®éçŽã«ããå§åçãªèŠéãã®è¯ã
- ãããŸã§
FormRequestãAPI ResourceããããŠæã«ã¯DTOã¯ã©ã¹ãšãè€æ°ã«åæ£ããã¡ã ã£ãããŒã¿å®çŸ©ãããªããŒã·ã§ã³ãã¬ã¹ãã³ã¹æŽåœ¢ã®è²¬åããDataã¯ã©ã¹1ã€ã«éçŽãããŸããé¢é£ããã³ãŒãã1ãã¡ã€ã«ã«ãŸãšãŸãããã仿§å€æŽæã®ä¿®æ£ç®æãæç¢ºã«ãªããä¿å®æ§ãåçã«åäžããŸããã
- ãããŸã§
- éçè§£æãšã®çžæ§æçŸ€ã§ãã³ãŒããå
ç¢ã«ãªã
- å šãŠã®ããŒã¿ãåå®çŸ©ããããªããžã§ã¯ãã«ãªããããPHPStanãªã©ã®éçè§£æããŒã«ãšã®çžæ§ãæé«ã§ããé åã®ããŒééãã®ãããªåçŽãªãã¹ãéçºæ®µéã§æ€ç¥ã§ãããããã³ãŒãã®å質ãšå ç¢æ§ãæ Œæ®µã«äžãããŸãã
- æè»ãã€åŒ·åãªããŒã¿å€ææ©èœ
- ãã¹ãããDTOããç¹å®ã®æ¥ä»ãã©ãŒããããèªåã§
Carbonã€ã³ã¹ã¿ã³ã¹ã«å€æããCastæ©èœãããããã£åãå€ããMapæ©èœãªã©ãããããšããã«æãå±ãããŒã¿å€ææ©èœãéåžžã«åŒ·åã§ããããã«ãããããŒã¿ãœãŒã¹ã®åœ¢ãæ°ã«ããããšãªããã¢ããªã±ãŒã·ã§ã³å éšã§ã¯åžžã«çæ³çãªããŒã¿æ§é ãä¿ã€ããšãã§ããŸãã
- ãã¹ãããDTOããç¹å®ã®æ¥ä»ãã©ãŒããããèªåã§
6. èæ ®ãã¹ããã¡ãªãããšæ³šæç¹
- åŠç¿ã³ã¹ããšãSpatieæµããžã®æ
£ã
- Laravelæšæºã®
FormRequestãAPI Resourceãšã¯ç°ãªãèšèšææ³ã®ãããå°å ¥ã«ã¯äžå®ã®åŠç¿ã³ã¹ããããããŸããç¹ã«ãlaravel-dataç¬èªã®ããŒã¿çæãã€ãã©ã€ã³ãé«åºŠãªæ©èœã䜿ãããªãã«ã¯ãå ¬åŒããã¥ã¡ã³ãã®èªã¿èŸŒã¿ãå¿ é ã§ãã
- Laravelæšæºã®
- ãã¡ã€ã«æ°ã®å¢å ãšåé·æ
- Portoãšåæ§ã«ãã·ã³ãã«ãªCRUDæ©èœã§ãã£ãŠãå¿
ã
Dataã¯ã©ã¹ãäœæããããšã«ãªããŸããããªã¯ãšã¹ãããã®ãŸãŸä¿åããã ããã®ãããªåçŽãªåŠçã§ã¯ãå°ãã ããã¡ã€ã«ãå¢ãããäœæ³æãæ°ã«ãªããããããŸããã
- Portoãšåæ§ã«ãã·ã³ãã«ãªCRUDæ©èœã§ãã£ãŠãå¿
ã
- å°èŠæš¡ãªãããžã§ã¯ãã«ã¯éå°ã«ãªãå¯èœæ§
- Bladeãã¥ãŒãã¡ã€ã³ã®äŒçµ±çãªWebã¢ããªã±ãŒã·ã§ã³ããAPIãæ°æ¬ãããªããããªå°èŠæš¡ãããžã§ã¯ãã®å Žåã
FormRequestãšAPI Resourceã§ååãªã±ãŒã¹ãå€ãã§ããå°å ¥ã®ã¡ãªããããèŠçŽãåŠã¶ã³ã¹ããäžåããã©ããã®èŠæ¥µãã¯å¿ èŠã§ãã
- Bladeãã¥ãŒãã¡ã€ã³ã®äŒçµ±çãªWebã¢ããªã±ãŒã·ã§ã³ããAPIãæ°æ¬ãããªããããªå°èŠæš¡ãããžã§ã¯ãã®å Žåã
7. çµè«ïŒç§ãã¡ã®ãããžã§ã¯ãã¯laravel-dataãæ¡çšãã¹ããïŒ
laravel-dataãåããŠãããããžã§ã¯ã
- APIãå€çšãããããã³ããšã³ãåé¢åã®ã¢ããªã±ãŒã·ã§ã³ïŒSPA, ã¢ãã€ã«ã¢ããªãªã©ïŒ
- é·æçã«éçšã»æ¡åŒµãèŠèŸŒãŸãããäžãå€§èŠæš¡ãµãŒãã¹
- è€éãªããŒã¿æ§é ããå€éšAPIãšã®é£æºãå€ã
- ããŒã éçºã§ã³ãŒãã®å質ãšäžè²«æ§ãé«ãä¿ã¡ãã
laravel-dataãåããŠããªããããžã§ã¯ã
- Bladeãã¡ã€ã³ã®å°èŠæš¡ãªWebãµã€ã
- ãããã¿ã€ãã³ã°ãªã©ãéçºã¹ããŒããæåªå ããããã§ãŒãº
- ããŒã ã¡ã³ããŒãLaravelã®åºæ¬æ©èœã«ãŸã æ £ããŠããªã段é
8. ãããã«
laravel-dataã¯ãLaravelã«ãããããŒã¿ã®åãæ±ãããããå®å
šã§ãèŠéããè¯ãããããŠéçºè
ãã¬ã³ããªãŒã«ããŠãããéåžžã«åŒ·åãªããã±ãŒãžã§ãã
ç¹ã«APIéçºã«ãããŠã¯ãFormRequestãšAPI Resourceã®ä¹±ç«ã«ããã³ãŒãã®éè€ã忣ãšãã£ã課é¡ãåçã«æ¹åããŠãããŸãããããžã§ã¯ãã®ç¹æ§ãèŠæ¥µããäžã§ããã²å°å
¥ãæ€èšããŠã¿ãŠã¯ãããã§ããããã