Laravelå€§èŠæš¡éçºå ¥éïŒMVCåé¢ã®FatModelåé¡ã«å¯Ÿãã責任åé¢ãšäŸå管çããã®èšèšãšèãæ¹ã«ã€ããŠ
ãã€ã«æ ªåŒäŒç€Ÿã¡ãã£ã¢ãã¯ãããžãŒäºæ¥æ¬éšã®å·¥è€ããã«MVCåé¢ã®FatModelåé¡ã«å¯Ÿãã責任åé¢ãšäŸå管çããã®èšèšãšèãæ¹ã«ã€ããŠè§£èª¬ããã ããŸããã
ããã«ã¡ã¯ããã€ã«æ ªåŒäŒç€Ÿã¡ãã£ã¢ãã¯ãããžãŒäºæ¥æ¬éšã§éçºãããŒãžã£ãããŠããŸãå·¥è€@ta99toã§ãã
ä»åã¯å€§èŠæš¡ã§è€é床ã®é«ãéçºãMVCãã¬ãŒã ã¯ãŒã¯ããŒã¹ã§æ§ç¯ããéã«åã課é¡ãšæããŠãããã€ã³ãããã®å ·äœçãªè§£æ±ºææ³ã«ã€ããŠè§£èª¬ãããŠããã ããããšæããŸãã
- ãMVC以äžã®è²¬ä»»åé¢ã€ã¡ãŒãžãã€ããªããïŒã
- ãDDDãšãã¯ãªãŒã³ãšããªããªã³ãšããã®ãžãã®èšèšãã¿ãŒã³ã®å°å ¥ã¢ãããŒã·ã§ã³ãäžæã
- ãã©ããã£ãŠãæçµçã«ã¯è€éã«ãªã£ãŠè¿œå éçºãä¿®æ£éçºãæãç¶æ ã«ãªã£ã¡ããã
âãã®ãããªæ©ã¿ãæã£ãæ¹ã«å¯ŸããŠæ¬è³ªçãªèª²é¡ã®æ§é ã«å¯Ÿããçè§£ãæ·±ãŸã£ããããã®è§£æ±ºææ³ãææ¡ãããããªãšã³ããªãŒãšãªãã°è¯ããªãšèããŠããŸãã äžèšã«å°ãã§ãå ±æã®ãã£ãwebãšã³ãžãã¢ã®æ¹ã¯ãã²æåŸãŸã§ç®ãéããŠã¿ãŠãã ãããã
ãŸãããšã³ãžãã¢ã®æ¹ã§ãªããŠããªããšãªãããã£ããããªæ°ã«ãªãã衚çŸãç®æããŸãã®ã§æ¥åäžãããšã³ãžãã¢ãšé¢ããããšããæ¹ããã²èªãã§ã¿ãŠãã ããïŒ
- æŠèŠ
- Laravelãªã©MVCãã¬ãŒã ã¯ãŒã¯éçºã®æ±ãã課é¡
- Laravelã®äŸã«èŠãFatModel/FatControlleråé¡ã®è§£æ±º
- å ·äœçãªäºäŸ
- ãŸãšã
æŠèŠ
ã·ã¹ãã éçºã¯ãã®èŠæš¡ã倧ãããªãã°ãªãã»ã©æ€ç¥ãã«ããæè¡çãªèª²é¡ãå éšã«çޝç©ãããããªã£ãŠããŸããŸãã
ãã®ãããªãããããæè¡çãªè² åµããéçºãããžã§ã¯ããæ±ããŠããŸãçŸè±¡ã®äž»ãªèŠå ã®ïŒã€ãšããŠãèªåãã¡ã®å®è£ ããããã°ã©ã ã®ïŒã€ïŒã€ã«å¯ŸããŠé©åã«è²¬ä»»ã圹å²ãäžãããåæ ãããããããããªè²¬ä»»åé¢ãäŸå管çã®ã³ã³ãããŒã«ãã§ããŠããªããšããããšãæããããŸãã
èŠæš¡ã«ãã£ãŠé©åãªè²¬ä»»åæ ã圹å²åæ ã®ç²åºŠã¯å€ããã®ã«ããã«å¯Ÿå¿ããèšèšææ®µãå®è£ ææ®µãæããã«ãããšèŠä»¶ãšã¹ãã«ã®ãã¹ããããçºçãããã®ã®ã£ãããæ§ã ãªèª²é¡ãåŒãèµ·ããèŠå ãšãªã£ãŠããŸããŸãã
ããããã·ã¹ãã ã®èŠä»¶ãèŠæš¡ã®å¢å€§ãåŒãèµ·ããè€éãã®è§£æ±ºã«ææŠããŠããå 人ãã¡ã®æ©ã¿ãã¢ãŠãããããåçš®èšèšã¢ãŒããã¯ãã£ã§ããããªããžã§ã¯ãæåã§ãã
è¿å¹Žã®webéçºã§ã¯MVCãã¬ãŒã ã¯ãŒã¯ãå©çšããéçºãäžè¬çã«ãªã£ãŠããŠå°ããªã¢ããªã±ãŒã·ã§ã³ã§ããã°ç¹ã«é£ããããšãèããªããŠãåãç©ãå®è£ å¯èœã«ãªã£ãŠããã®ã§ãããäžèŠæš¡ä»¥äžã®ãã®ãæµåçãªèŠä»¶ã«å¯Ÿå¿ããããç¶æ ãä¿ã¡éçšéçºããŠããããšãå®çŸããããšãããšå è¿°ãããšã³ãžãã¢ãªã³ã°ã¹ãã«ãæ¬ ããç¶æ ã§ã¯å¯Ÿå¿ãé£ããå ŽåãåŸã ã«ããŠãããŸãã
æ¬çš¿ã§ã¯ãã®ãããªã·ã¹ãã éçºã®è€éããåŒãèµ·ãã課é¡ã®çå ã«ã€ããŠèå¯ãã解決ã®å ·äœçãªææ³ãèšèšã¢ãŒããã¯ãã£ã®ãããã®éšåãç°¡åã«ç޹ä»ããããšæããŸãã
Laravelãªã©MVCãã¬ãŒã ã¯ãŒã¯éçºã®æ±ãã課é¡
課é¡ã®è©±ãããäžã§çè§£ãå¿ èŠãªãã¬ãŒã ã¯ãŒã¯ãORMãMVCåé¢ãªã©çšèªã®èª¬æãã¯ããã«ãã£ãããšããŠããå 容ã«å ¥ã£ãŠãããããšæããŸãã
ãã¬ãŒã ã¯ãŒã¯ãORMæŠèŠ
ããŒããwebéçºã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯å€§äœãã®ORMïŒObject Relational MappingïŒãšåŒã°ããä»çµã¿ãçšæãããŠããŸãã
ååã®éãããŒã¿ããŒã¹ã®ïŒããŒãã«ïŒããŒãã«ãšå¯Ÿã«ãªãããã¯ã©ã¹ïŒObjectïŒãçšæãããã¬ãŒã ã¯ãŒã¯ã§å®è£ æžã¿ã®åŠçãç¶æ¿ããã°ããã«ããŒã¿ããŒã¹ã«å¯ŸããŠèªã¿æžããè¡ãåŠçãå®è£ å¯èœã«ãªããšãããã®ã§ãã
// BlogPostãšããã¯ã©ã¹åãå
éšã§blog_postsãšããæååã«å€æããŠããŒãã«ãæ¢ãã«è¡ããŸã
class BlogPost extends Model
{
}
// ããã°æçš¿ãå
šãŠååŸããŸã
$allBlogPosts = BlogPostModel::all();
äžèšã®ããã«RDBã§ãµããŒããããŠããããŒã¿ããŒã¹ã§ããã°SQLãäžåèšè¿°ããã«ããŒã¿ããŒã¹ãšã®ãããšããåŠçã§ããŸãã
ãããããã¬ãŒã ã¯ãŒã¯ãçšæããŠãããã¢ã»ãããæŽ»çšããããšã§éçºå·¥æ°ãççž®ã§ãããšããã®ããã¬ãŒã ã¯ãŒã¯å°å ¥ã®ïŒã€ã®å€§ããªã¢ãããŒã·ã§ã³ã§ãã
ããŒã¿ããŒã¹ãšã®ããåããè¡ãåŠçãæœè±¡åãããŠãããããã°ã©ãã¯allãšãã颿°ã®å¥¥ã§å®éã©ããªåŠçãå®è¡ãããŠããã®ãç¥ãããšãå®çŸãããåŠçãå®è£ ããããšãã§ããããã«ãªããŸããã
ãããããéçºã³ã¹ããäžãããããªä»çµã¿ããšããMVCåé¢ã®ã«ãŒã«ããäžããŠãããã®ããã¬ãŒã ã¯ãŒã¯ã§ãã
MVCåé¢ãšã¯
webãµãŒãã¹ãã¢ãã€ã«ã¢ããªãªã©ã®UIãååšããã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠã
- èŠãç®ïŒViewïŒ
- ãŠãŒã¶å ¥åã®è§£éãåŠçã®å®è¡ïŒControllerïŒ
- ããžãã¹ããžãã¯ïŒModelïŒ
ã®3ã€ã«åããŠéçºããããšã§ä¿å®æ§ãéçšæ§ãæ ä¿ããããšããèšèšæ¹éã®ïŒçš®ã§ãã
ããžãã¹ããžãã¯ãšããã®ã¯äŸãã°Twitterã®ãããªSNSã®ã·ã¹ãã ã§èšããªã
- ããã€ãŒãã¯ãªãã€ãŒãã§ããã
- ããã€ãŒãå 容ã«ã¡ã³ã·ã§ã³ä»ããŠãã該åœãŠãŒã¶ã«éç¥é£ã°ãã
ãªã©ã®ã·ã¹ãã ã®äžå¿ã«ååšããããŒã¿æ§é ãšãã®æ¯ãèãã«é¢ããå®è£ ã®ããšã§ãã
MVCãã¬ãŒã ã¯ãŒã¯ã®å眪
ãšããèš³ã§ãèå¿ãªã®ã¯ã¢ãžã¥ãŒã«éã®è²¬ä»»åé¢ãäŸå管çãããŸãããããããäºã§ãã£ãŠãMVCãšã¯ãã®ããã®ææ®µãæŠå¿µã®1ã€ã§ãã
ãšãããMVCãã¬ãŒã ã¯ãŒã¯ç¹æ ã®çµæãšããŠãã®èŸºã®åæãæããªããŸãŸãšããããMVCã§åãããšããããšã ããåºã浞éããŸããã
çµæãšããŠFatControllerãFatModelãšåŒã°ãããControllerãModelã®ïŒã¯ã©ã¹ã«æ°çŸè¡ãã®åŠçãæžããŠããŸãå®è£ ãéç£ããäžææè©±é¡ã«ãªã£ãããšããããŸãã
- ããŒã¿æ§é ãåŠçãããŒããªããžã§ã¯ãã§è¡šçŸãããšãããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®åºç€
- ãœãŒã¹ã³ãŒãã®å質ãç¶æããŠå®è£ ãæ¡åŒµããŠããã«ã¯ã©ãããã°ããã
ãã®ãããªåºç€ãç¡ããŸãŸMVCãã¬ãŒã ã¯ãŒã¯ãšããããŒã«ã ããåºãŸã£ãŠãã£ãããšã§ãModelã«ã¯ããŒã¿ããŒã¹ãšã®ããåãã«é¢ããæ å ±ãæº¢ããŠæ¬è³ªçãªããŒã¿æ§é ãããžãã¹ããžãã¯ãéã¿ãControlerã«ã¯æŒãåºããããžãã¹ããžãã¯ãåå²ãã ãã ããšæžãããŠã·ã§ã«ã¹ã¯ãªããããªç¶æ ã
ããããæ®å¿µãªå質ãè² åµãšããŠæ±ãããããã¯ãããããå¢ããŸããã
äžæ¹ã§ããããããã¬ãŒã ã¯ãŒã¯ããšèšãåœ¢ã§æäŸãããéçºã¯ãŒã¯ãããŒã¯webéçºã®ããŒãã«ãå€§å¹ ã«åŒãäžããå®ã«å€ãã®ãããã¯ãã®èªçã«äžçäžã§è²¢ç®ããŠããŸãã
ããããæå³ã§ã¯æ°å€ããOSSãããã¯ãã®äžã§ãããã¬ãŒã ã¯ãŒã¯ããšèšãã«ããŽãªãå®äžçã«åãŒããçã¯éåžžã«å€§ããªãã®ããããŸãã
課é¡ã®æ£äœ
MVCãã¬ãŒã ã¯ãŒã¯ãæ±ããwebãšã³ãžãã¢ã¯ãããããããã§ãããã¢ãžã¥ãŒã«éã®é©åãªè²¬ä»»åé¢ãäŸå管çãæ å ±èšèšãè¡ãäºæ¥ã®ã¹ã±ãŒã«ã«åãããŠã·ã¹ãã ãå®å¿ãå®å šã«æ¡åŒµãæ¡å€§ããŠãããä»çµã¿ã¥ãããææ¯ããã§ãããšã³ãžãã¢ãããŸãããªãã®ã§ãã
ãããªç¶æ ã§é²ããéçºãããžã§ã¯ãã¯ä»¥äžã®ãããªèª²é¡ãæ±ããŸãã
- åå©çšæ§ãäœãéçºãé²ãã§ãé²ãã§ã楜ã«ãªããªããã³ãŒãã®å¢å ã¯è€é床ã®å¢å ã«æ¯äŸãã©ãã©ãéçºã¹ããŒããéåããã
- äŸå管çã®è³ªãäœããã£ã¡ãçŽãã°ãã£ã¡ãå£ãããéã«ïŒç®æçŽãã°æžããããªä¿®æ£ã®ã¯ãããã¡ãã¡ãããå¿ èŠãããã
- æ å ±èšèšã®è³ªãäœãããŒã¿ããŒã¹ã®æ£èŠåãããŸããã£ãŠãªããäžèªç¶ãªUIãäžèªç¶ãªããŒã¿æ§é ã
- çæ³åœ¢ã®ã€ã¡ãŒãžããªãã®ã§ã³ãŒãã¬ãã¥ãŒãèšèšã¬ãã¥ãŒã§çªã£èŸŒãããšãªããŠã¬ãã¥ãŒäœå¶ã圢骞åããŠãã
- ãœãŒã¹ã³ãŒãã®èŠéããæªããã£ããã¢ããããã®ã«æéããããã
çæ³ã¯ä»¥äžã®ãããªç¶æ ãã€ããããšã§ãã
- åå©çšæ§ãé«ãéçºãé²ãã»ã©å®å šã§äŸ¿å©ãªã¢ãžã¥ãŒã«ãå¢ããŠæ°èŠéçºãä¿®æ£ã楜ã«ãªãéçºã¹ããŒããäžããã
- äŸå管çã®è³ªãé«ãæ¹ä¿®ã®åœ±é¿ç¯å²ãæç¢ºã§ïŒç®æçŽãã°å¿ èŠãªç®æã¯å šãŠçŽãã
- æ å ±èšèšã®è³ªãé«ãããŒã¿ããŒã¹ã¯é©åã«æ£èŠåãå¿ èŠãªãšããã¯åé·åãããŠãããèªç¶ãªUIãèªç¶ãªããŒã¿æ§é ã
- çæ³åœ¢ã®ã€ã¡ãŒãžãããããã«æ²¿ããªãèšèšãå®è£ ãæåŠãæ¹åããä»çµã¿ãšããŠã¬ãã¥ãŒãã¯ãŒã¯ããŠããã
- ãœãŒã¹ã³ãŒãã®èŠéããè¯ããã£ããã¢ããã«æéãããããªãã
ããããçæ³ç¶æ ã®å®çŸã劚ãã課é¡ã¯äœã§ããããã
ããã¯ã©ã¡ãããšèšãã°
ãããã°ã©ãã³ã°ã®é£ãããããéçºãããžã§ã¯ããããžã¡ã³ãã®é£ããã
ãšèšãããã¯
ãèªåã§ã¯ãªãäœãã®éåïŒäººãªããããã°ã©ã ïŒã«é©åã«è²¬ä»»ã圹å²ãäžããŠä»£ããã«ä»äºãããŠãããããšã®é£ããã
ã ãšåã¯èããŠããŸãã
ã·ã¹ãã ãçµç¹ãšããŠèŠãæãåŸæ¥å¡ãšããŠã®ãœãŒã¹ã³ãŒããå¶åŸ¡ããä»çµã¿
äŒç€Ÿçµç¹ã«ãããæªçãšæç
äŒç€Ÿçµç¹ãšããã®ã¯è¯ãã§ããä»çµã¿ã§ãé©åã«è²¬ä»»åé¢ãç®æšèšå®ã圹å²åæ ãããçµç¹ãšããã®ã¯çްããæç€ºã管çãç¡ããŠãç®æšã«å¯ŸããŠå人åäººãææ©çã«åãå調ããã£ãŠææããããŸãã
å察ã«ããã§ãªãçµç¹ã責任ç¯å²ãææ§ã ã£ãã圹å²ãéè€ããŠããããªã©èšèšã«åé¡ã®ããçµç¹ã«ãããŠã¯éç«¯ã«ææããããã©ããããã©ãã«ã°ãããçµç¹ã人ã«èµ·å ããåé¡è§£æ±ºã«çµå§ããŠããŸãäºæ¥æé·ã©ããã§ã¯ãããŸããã
æŽã«ã¯ãããã人ãçµç¹æ§é ã«èµ·å ãã課é¡ã¯èŠããªããšããã§ãã£ãããšé²ããããç®ã«èŠããã»ã©äžå ·åãèç©ããŠãããæ€ç¥ããæç¹ã§èª²é¡ã®ãµã€ãºã¯æ¢ã«å€§ããè€éã«èšããã§ããŠè§£æ±ºããã®ã«æéãèŠããŸãã
ã·ã¹ãã éçºã«ãããæªçãšæç
ã·ã¹ãã éçºã«ãããŠãåæ§ã«ããŸã責任åé¢ãäŸå管çããããŠããªãå®è£ å士ãããŸãå調ããããšã¯é£ãããè€æ°äººã§éçºããŠãããªãå°æŽããã®ãããªç¶æ³ã§ããã°ã©ãAãšããã°ã©ãBã®å®è£ ãããŸãå調ããŠææãããããšèšãã®ã¯é£ããããã§ãã
ããããäžååé³ãæ€ç¥ã§ããæŸçœ®ããçµæãæ éçãéçºã¹ããŒãã®äœäžãšãã£ãããžãã¹ãããŒãžã£ãã®ç®ã«ãèŠããã»ã©ã®åœ±é¿ãåãŒãåºãé ã«ã¯ããæ¢ã«æé ããã·ã¹ãã ãšããåã®çµç¹ã¯æ¢ã«å£æ»ããŠããéšåæé©ã§ãªããšããªãç¶æ³ã§ã¯ãªããªã£ãŠããŸãã
å察ã«ã綺éºã«èšèšãããã·ã¹ãã ã®äžã§ãªãå®è£ ãšå®è£ ã¯éçºè ãé©ãã»ã©çŸããç¹ããã飿ºããææãããããã®ã§ãã
çµæã®å·®ç°ãçããã®
ããªãã綺éºã«èšèšãããçµç¹ã«ããå Žåãããªãã«ä»»ãããè²¬ä»»ãæš©éãç®æšã¯æç¢ºã§ãããããæ¥äœãã®æ¥åã«å¯Ÿå¿ããããšããæã«ãã®æ¥åãäŸåããéšçœ²ã飿ºã®å¿ èŠãªã¡ã³ããŒã¯æããã§ãããè¿·ã£ãŠåããªããšèšãããšã¯ãªãã§ãããã
äŸãã°ãæ°ããããŒã«ãå°å ¥ãããããšæã£ãæãããã¯
- çšè°ã®äœæ
- äžåžã®æ¿èª
- æ³åã®ãªãŒã¬ã«ãã§ãã¯
ã®3ã€ã«äŸåããããšãæç¢ºã§ããã®éãã«ããã°ããããããšãéæã§ãããšèšãããšãæããã§ãã
- ããªãã¯ãããžã§ã¯ãå ã§ä»»ããã責任ãå šãããããã«çšè°ãäœæãææ¡ããæš©éãæã£ãŠããã
- ããªãã®äžåžã¯äºç®ç®¡çãšãããžã§ã¯ãç®æšéæã®è²¬ä»»ãå šãããããã«ææ¡ãããå å®¹ãæ¿èªãããå·®ãæ»ãæš©éãæã£ãŠããã
- æ³åã¯çµç¹ã«ãªã¹ã¯ã®ããããŒã«ãå°å ¥ãããªããšãã責任ãæãããããªãŒã¬ã«ãã§ãã¯ãå®è¡ããæš©éãæã£ãŠããã
ããããäŒç€Ÿçµç¹å ã«ãããããŒã ãšããŒã ã人ãšäººã®èªç«çã§å®å šãªé£æºãå¯èœã«ããŠããã®ã
- ããŒã ãããŒã«ã®è²¬ä»»ç¯å²ãšæš©éãæç¢ºã§ããããš
- æ¥åãšæ¥åã®äŸåé¢ä¿ãæç¢ºã§ããããš
ãªã®ã§ãã
äžæ¹ããããèšèšã®ç Žç¶»ããçµç¹ã§ã¯ã©ãã§ãããã以äžã®ãããªããšãèµ·ããŠããŸãå¯èœæ§ããããŸãã
- çšè°ã¯äœæãããããããªãã£ããã誰ã«ãã§ãã¯ããŠãããã°ãããããããªã
- 管çè·ã®ããããç¥ããªããšããã§åçºæ³šãè¡ãããŠãã
- ãªãªãŒã¹ãããµãŒãã¹ãå®ã¯æ³åŸã«éåããŠãã
ã©ãã§ããããããããªããšã¯äŸã«æããã»ã©æ¥µç«¯ã§ã¯ãªãã«ããŠããã¡ãã¡ã§å®éã«èµ·ããŠããããšã§ãã
ãããã責任ç¯å²ãšæš©éã®æŽèµ°ãäŸåé¢ä¿ã®äžæç¢ºããäžéœåãèµ·ããã®ã¯ã·ã¹ãã ã«ãããŠããŸãåãã§ãããããã·ã¹ãã ã§ã¯
- ã¡ã€ã³ã«ãŒãã³ãèªãã§ãäœããããã®ãããããªãïŒããžãã¹ããžãã¯ã®æŒæŽ©ã宣èšçã§ãªãæç¶ãçãªå®è£ ïŒ
- å ¥åãšåºåãäžæç¢ºã§åå©çšãæãïŒäŸåé¢ä¿ã®äžæç¢ºïŒ
- ã©ãããã©ããããåŒã°ããŠããã ãåãããªãã°ããŒãã«ãªå€æ°ã颿°ïŒè²¬ä»»ç¯å²ã®äžæç¢ºãäŸåé¢ä¿ç®¡çã®æŸæ£ïŒ
âãããã£ãç¶æ³ãçºçããŠããŸãã
ããããçŸè±¡ãé¿ããããã«ã
- ççŸãç¡é§ã®ãªãæŽåæ§ã®åããæ å ±èšèš
- 1ã€ã®ãŸãšãŸãã1ã€ã®ç®çã«éäžã§ãããããªè²¬ä»»åé¢
- ãªããžã§ã¯ãéã®é¢ä¿ãæç¢ºã«èª¬æããäŸå管ç
ãå¿ èŠãªã®ã§ãã
課é¡èå¯ãŸãšã
ãšããããäœåºŠãæžããããšã
- 責任åé¢
- äŸå管ç
- æ å ±èšèš
ãã·ã¹ãã éçºã«ã¯ïŒäžè¬çãªäŒç€Ÿçµç¹ã«ãããçµç¹èšèšã«ãŠéèŠãšãããã®ãšåçšåºŠããã以äžã«ã¯ïŒéèŠãªãã ããšèšãäž»æšã«ã€ããŠã¯ãªããšãªããçè§£ããã ããããããªãã§ããããã
ããã§ã¯å ·äœçã«ã©ã解決ããã®ããšèšãã®ã次ã®ã»ã¯ã·ã§ã³ããã³ãŒããæ·»ããªããèŠãŠãããããšæããŸãã
Laravelã®äŸã«èŠãFatModel/FatControlleråé¡ã®è§£æ±º
åé ã§
- FatModelïŒå€ªã£ãã¢ãã«ïŒ
- FatControllerïŒå€ªã£ãã³ã³ãããŒã©ïŒ
ã®è©±ãããŸãããããªãã§å€ªãããšèšããšãã®2ã€ãæ ã責åãå€ãããã§ãã
éã«ãããFatã«ãªããã«æžãèŠæš¡ãªããã®ïŒã€ãåšçšã«è²¬ä»»ãå ŒåããŠå¹ççã«èŠä»¶ãæºãããŠããç¶æ ãšèšããã§ãããã
ãããã¿ã€ãéçºãéçºè ã®äººæ°ã1人ïœ2人ã»ã©ã®èŠæš¡ã§ããã°ç¹ã«åé¡ã«ã¯ãªãã«ããã¯ãã§ãã
ãã以äžã®èŠæš¡ã«ãªãæã«ã¯ãã¯ãå ŒåãããŠãã責任ãå¥ãããŠããããæé©åããŠããå¿ èŠãåºãŠããŸãã
Modelãšã¯
æ¥ãŸããããã®èª¬æãè¶ ãããã
äœæ ãªãæ§ã ãªèšèšãã¿ãŒã³ãåçš®ããã°ã©ãã³ã°èšèªãè²ã ãªèšèªãã©ãã€ã ãã«ãããŠããããã®æèã§åŸ®åŠã«éãæå³ãã§ãããã䌌ãŠãæãã§ãã®Modelãšèšãåãèšèã䜿ããèªãããã®ã§äžè¬çã«ããã§ãããšããã®ãéåžžã«èšãã«ããã®ã§ãã
ãªã®ã§ãŸãããã§ã¯webéçºã§æãããã¥ã©ãŒãªMVCãã¬ãŒã ã¯ãŒã¯ã§ããLaravelã®Modelã¯ãããªæãã§ããšããã®ã瀺ãããããã課é¡èšå®ãè§£æ±ºææ³ã®è©±ã«å ¥ã£ãŠãããããšæããŸãã
Laravelã®Model
// postsããŒãã«ã«å¯Ÿå¿ããæçš¿ã¢ãã«ïŒããã°CMSã¿ãããªãã®ãã€ã¡ãŒãžïŒ
class Post extends Model {
// getterãã¡ã³ãããã¥ãŒãã¿ã®å®è£
ãå©çšãå å·¥ããŠè¿ã
public function getContentAttribute($value)
{
return escape($value);
}
public function slug()
{
return hash($this->id);
}
// authorsããŒãã«ã«å¯Ÿå¿ããèè
ã¢ãã«ã®1ã€ãšãªã¬ãŒã·ã§ã³ãæã€
public function author()
{
return $this->belongsTo('authors');
}
// commentsããŒãã«ã«å¯Ÿå¿ããã³ã¡ã³ãã¢ãã«ã®è€æ°ãšãªã¬ãŒã·ã§ã³ãæã€
public function comments()
{
return $this->hasMany('comments');
}
public static function publishAll()
{
self::query()->update(['publish_flg' => 1]);
}
}
// ããŒã¿ã®ååŸãã§ãã
$firstPost = Post::first();
// ååŸããããŒã¿ã¯ãæçš¿ããªããžã§ã¯ããšããŠåäœãPostã¯ã©ã¹ã«å®è£
ãããã¡ã³ãã颿°ãåç
§ã§ãã
echo $firstPost->title;
echo $firstPost->slug();
// ããŒã¿ã®æŽæ°ãã§ãã
$firstPost->content = 'hoge';
$firstPost->save();
// èšäºã®å
šå
¬éãã§ãã
Post::publishAll();
// ããŒã¿ã®åé€ãã§ãã
$firstPost->delete();
ãã®Laravelã«ãããModelã§å®è£ ããPostModelã¯
- ããŒã¿ããŒã¹ããæçš¿ããŒã¿ãåãåºã
- ããŒã¿ããŒã¹ãžæçš¿ããŒã¿ãä¿åãã
- åãåºããæçš¿ããŒã¿ã§æçš¿ãªããžã§ã¯ããäœæãã
ãšããæ©èœãæã£ãŠããã®ãããããšæããŸãã
ããã§æ³šæãããã®ããèŠæš¡ã®å€§ããªéçºã§ã¯ããŒã¿ããŒã¹ã«èªã¿æžããã«ããåŠçãšããã®ã¯éåžžã«ã³ã¹ãã®é«ãããªã±ãŒããªåŠçã§ããããšããããšã§ãã
ãã®ããŒã¿ããŒã¹ãžã®IOãšããããªã±ãŒããªæš©éããå®è£ åçŽåã®ããã«æçš¿ãªããžã§ã¯ããæã£ãŠããŸã£ãŠããŸãã
ããããªã課é¡ã«ãªããã§ããããã
äŸãã°ãã®æçš¿ãªããžã§ã¯ãã䜿ã£ãŠèšäºäžèЧãçæããåŠçãèããŠã¿ãŸãããã
post/index.blade.php
@foreach($posts as $post) <a href="{{ $post->url }}">{{ $post->title }} @endforeach
æçš¿ãªããžã§ã¯ããè€æ°ã»ãããããiterableãªCollectionã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåãåã£ãŠforeachã«ãããŠãªã³ã¯ãæçš¿ã®æ°ã ãçæããŠããŸãã
äžèšã¯MVCã§ãããšViewã«ãããèŠãç®ãçæããå®è£ ã§ãã
å è¿°ããæçš¿ãªããžã§ã¯ãã«DBã¢ã¯ã»ã¹ã®å®è£ ãå ¥ã£ãŠãããšããã®ã¯ããã®ã«ãŒãããã$postïŒã€ïŒã€ãDBã«ã¢ã¯ã»ã¹ããæ©èœãæã£ãŠãããšããããšãªã®ã§ãã
post/index.blade.php
@foreach($posts as $post) <a href="{{ $post->url }}">{{ $post->title }} @php($post->delete()) // ãããªããšã @php($post::publishAll()) // ãããªããšãã§ãã¡ããã£ãŠããš @endforeach
å®éã«ãã®ãããªã³ãŒããäžãã£ãŠããããšã¯ãªããšæããŸããããããæ°ã«ããããšãã€ãŸãèªåã®å®è£ ãè¿ãããªããžã§ã¯ããä»ã®ãšã³ãžãã¢ãã©ãæ±ããããã£ããã³ã³ãããŒã«ããããšãã¯è€æ°äººã®ãžã¥ãã¢ãšã³ãžãã¢ãçããŠéçºãè¡ãããšãä»»ããããªãå¿ èŠãªèæ ®ã§ãã
ãã®æçš¿äžèЧã¯
- æçš¿ãªããžã§ã¯ããèšäºã®URLãšã¿ã€ãã«ãæ£ããè¿ããŠãããããš
- æçš¿ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãiterableïŒã«ãŒãå¯èœïŒã§ããããš
ãæåŸ ããŠããã ãã§ããã以å€ã®ããšã«é¢å¿ããããŸããã
ãã以å€ã®ããšã«ã¯äŸåããŠããªãã®ã§ãã
ããã¯ã以äžã®ãããªç¶æ ããããšããããšã§ãã
- æ¬åœã¯ãã£ãšã·ã³ãã«ãªå€æž¡ãã ãã§æç«å¯èœãªåŠçãªã®ã«å¿ èŠä»¥äžã«å€§ããªæ å ±ãæž¡ããŠããŸã£ãŠãã
- èŠãç®ã«é¢ããããšã«è²¬ä»»ãæã£ãViewãDBã¢ã¯ã»ã¹æš©ãšããäžèŠãã€éå€§ãªæš©éãïŒæçš¿ãªããžã§ã¯ããéããŠïŒæã£ãŠããŸã£ãŠãã
ãããèš±ããŠããŸããšæå³ããªããšããããDBã¢ã¯ã»ã¹ãè¡ããããªå®è£ ãæ··å ¥ãããªã¹ã¯ããããŸãã
ãŸãDBã¢ã¯ã»ã¹ã«é¢ãã倿Žã®åœ±é¿ãviewãã¡ã€ã«ãåããŠããŸããšãããããªäžèªç¶ãªäŸåé¢ä¿ãã€ãã£ãŠããŸãããšã«ãªãã®ã§ãã©ã¡ãããããã«ãå¯äœçšã®æç¡ãæ°ã«ããããåŸãŸããã
ã³ãŒã ã¬ãã¥ãŒã§æ°ãé£ãç®æãå¢ããèªåã®ä»äºãå¢ãããŠããŸãããšã«ãªããŸãã
ãªã®ã§
- ãæçš¿ãšããããŒã¿æ§é ã®ãªããžã§ã¯ã衚çŸã
- ãæçš¿ããŒã¿ãååŸããŠæçš¿ãªããžã§ã¯ããçæããåŠçã
äžèšïŒç¹ãåé¢ããããšã§ããã解決ããŸãããã
Repositoryãã¿ãŒã³ --ModelããããŒã¿ããŒã¹IOã®è²¬åãå¥ãã--
ãŸãæ©èœãåã£ãæçš¿ãªããžã§ã¯ãããèŠãŠã¿ãŸãããã
Model/Post.php
// ã·ã³ãã«ãªæçš¿ãªããžã§ã¯ãã衚çŸããPostModel class PostModel { private $id; private $title; private $content; // æçš¿ãªããžã§ã¯ãã¯æçš¿ID,ã¿ã€ãã«,æç« ã®ïŒã€ã«äŸåããŠçæããã public function __construct ($id, $title, $content) { $this->id = $id; $this->title = $title; $this->content = $content; } // getter public function id() { return $this->id; } public function title() { return $this->title; } public function url() { return 'posts/' . $this->id;; } ... }
äœãç¶æ¿ããŠããªããšãŠãã·ã³ãã«ãªã¯ã©ã¹ã§ãã
ãæçš¿ãªããžã§ã¯ããã«äŸåããåŠçãäŸãã°å è¿°ããæçš¿äžèЧã®viewãäžèšã®PostModelãªããžã§ã¯ãã ãæž¡ããŠãããã°äºè¶³ããŸãã
äœãã®æåã«æå³ããDBã¢ã¯ã»ã¹ãããããªæ©èœãå®è¡ããããããªãªã¹ã¯ããªãã§ãã
æ¡åŒµããéã®å¯äœçšãéå®çã«ãªããŸãã
次ã«åé¢ããDBãšã®ãããšããè¡ãPostRepositoryã§ãã
Repository/IPostRepository.php
// PostRepositoryãå®è£ ããæã¯ä»¥äžã®ãããªå 容ãå®è£ ããŠããã°åäœããŸãããšãã颿°ãšå€ã®åºå ¥ãã®å®çŸ© interface IPostRepository { public function all():PostCollection; public function byId(PostId $id):PostModel; public function store(PostModel $post):PostModel; }
äžèšã¯PostRepositoryã®interfaceã®å®çŸ©ã§ãã
ãã®æ¡ä»¶ãæºããããã«ã以äžã®ããã«PostRepositoryãå®è£ ããŸãã
Repository/MySqlPostRepository.php
// æçš¿ããŒã¿ã®ååŸãæŽæ°ã«è²¬ä»»ãæã€PostRepositoryã®MySQL+Eloquentå®è£
class MySqlPostRepository implements IPostRepository
{
private $postEloquent;
public function __construct(PostEloquent $postEloquent)
{
$this->postEloquent = $postEloquent;
}
public function all():PostCollection
{
return $this->postEloquent::all()
->map(function($postElo){
return new PostModel(
$postElo->id,
$postElo->title,
$postElo->content
);
});
}
public function byId(PostId $postId):PostModel
{
$postElo = $this->postEloquent->find($postId);
return new PostModel(
$postElo->id,
$postElo->title,
$postElo->content
);
}
public function store(PostModel $postModel):PostModel
{
$postModel = $this->postElo::updateOrCreate(
['id' => $postModel->id()],
[
'title' => $postModel->title(),
'content' => $postModel->content(),
]
);
return new PostModel(
$postElo->id,
$postElo->title,
$postElo->content
);
}
}
DBãšã®ãããšãã®ããã«EloquentãæŽ»çšããŠããŸãã
ããã§ã¯EloquentãæŽ»çšããŠPostModelãæ£ããçæããåŒã³åºãå ãžè¿ããŠãããããšã ãã«éäžããŸãã
PostEloquentãPostRepositoryã«å¯ŸããŠäœã倿Žãå ããŠãå宣èšããéãPostModelãè¿ãããšãã§ããã°ããããå ã®åŠçã«å¯äœçšã¯å°ãªãããã§ãã
ããããŠæ¬åºããPostModelã«ã¯å çšãšå€ãã£ãŠDBã¢ã¯ã»ã¹ã§ãããããªæ©èœã¯ã€ããããŠããªãã®ã§ããã®ãªããžããªãåŒã³åºãåçš®ã¢ãžã¥ãŒã«å ã§å®å šã«å©çšããŠãããããšãã§ããŸãã
Repositoryã¯æ¬æ¥ã¯ã¹ãã¬ãŒãžãšã³ãžã³ãšå®è£ ã®ççµåãå®çŸããææ®µ
ãã®Repositoryãã¿ãŒã³ãæ¬æ¥å¯Ÿå¿ããããšãã課é¡ã¯ãäŸãã°æ¥ã«äŒç€Ÿéœåãäœãã®éœåã§ããŒã¿ããŒã¹ãMySQLããPostgresSQLã«å€æŽããªããšãããªããªã£ãããšãã£ããããªã±ãŒã¹ã§ã¹ãã¬ãŒãžãšã³ãžã³ãšå®è£ ãççµåã«ããŠãããªããšã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ä¿®æ£ã³ã¹ããé«ããªã£ãŠããŸãããšãããããªãã®ã§ãã
ã·ã¹ãã ããµãŒãã¹ã®ãŠãŒã¶ããã®ãµãŒãã¹ã®å®è£ ãPHPãªã®ãRubyãªã®ãPythonãªã®ããšããããšãæ°ã«ããå¿ èŠç¡ãããã®ãµãŒãã¹ã®æäŸäŸ¡å€ã享åã§ããããã«ãã·ã¹ãã ã®äžèº«ããŸãèªèº«ãäŸåããã¹ãã¬ãŒãžãšã³ãžã³ããã®ãã®äŸ¡å€ã®äº«åãRepositoryãšããïŒã€ã®é åãäž»ã«æ ãç¶æ ã«ããŠããããšã§æœè±¡åããäŸå床ãå¶åŸ¡ã圱é¿ç¯å²ãéå®çã«ããããšããåªåãªã®ã§ãã
ããããå 容ãå ·äœçã«ã¯èšèªä»æ§ã®interfaceãšããä»çµã¿ãçšããŠè¡ããŸãã
ãªããžã§ã¯ãæåãªã©ã®æèã§ããªããžã§ã¯ãã§ã¯ãªãã€ã³ã¿ãŒãã§ãŒã¹ã«äŸåããããšèšãã®ã¯ãã®ããã«åŸã§å®è£ ã®å 容ã容æã«äº€æã§ãããããã¹ããããããã£ãããšãå®è£ ã®å 容ã容æã«äº€æå¯èœãªç¶æ ãã®ãã®ã«äŸ¡å€ãããããã§ãã
ãã å®éã«ã¹ãã¬ãŒãžãšã³ãžã³ã®äº€æãè¿«ãããã·ãŒã³ãšããã®ã¯æ» å€ã«ç¡ãããå®éã®éçºçŸå Žã§ã¯
- å è¿°ãããããªããŒã¿ã¢ã¯ã»ã¹ãMVCãã¬ãŒã ã¯ãŒã¯Modelããåé¢ããã
- ãŠããããã¹ãæžãæã«ã¢ãã¯å·®ã蟌ã¿ãããããã«ããŠãããã
ãšãã£ãããŒãºãäž»ã ãšæããŸãã
ããããèæ¯ãããŒãºããinterfaceãšrepositoryã®å®è£ ã«ããããŒã¿ã¹ãã¬ãŒãžåšèŸºã®äºæ ãæœè±¡åããã¢ããªã±ãŒã·ã§ã³æ¬äœãMySQLãRedisãªã©ç¹å®ã®ããã«ãŠã§ã¢ã«äŸåãããªãããã«ããä»çµã¿ããªããžããªãã¿ãŒã³ãšèšããŸãã
ã¬ã€ã€ãŒãã¢ãŒããã¯ãã£ãªã©è²ã ãªèšèšãã¿ãŒã³ã«ç»å Žããåºæ¬çãªãã¶ã€ã³ãã¿ãŒã³ã®ïŒã€ã§ããããªããžã§ã¯ãæåããã°ã©ãã³ã°å šè¬çã«éããäŸå管çãæœè±¡åã«ã€ããŠã®äŸ¡å€èгãšã¢ãããŒã·ã§ã³ãæç¢ºã«è¡šããŠãããã¿ãŒã³ãšèšããã®ã§ãã£ããã€ã³ã¹ããŒã«ããŠãããããšããã§ãã
ValueObject --Modelããå€ä»æ§ã®å®è£ ãå·»ãåã--
ModelããããŒã¿ã¢ã¯ã»ã¹ã®åé¢ãRepositoryã«ãã£ãŠå®çŸããææ³ã玹ä»ããŸããããããã«ModelãæŽçããæ¹æ³ãšããŠValueObjectã玹ä»ããŸãã
å è¿°ããPostModelã«å®è£ ãããŠããåŠçã«ä»¥äžã®ãããªURLãçæããŠè¿ãå®è£ ããããŸããã
Model/PostModel.php
... public function url() { return 'posts/' . $this->id;; } ...
ãã®ãæçš¿URLã¯posts/{$id}ãšãããã©ãŒãããã§ããããšãã仿§ã¯æçš¿ã¢ãã«ã®ãã®ãšããããã¯ãæçš¿ã¢ãã«ãã¡ã³ããšããŠææããURLãšããå€ã®ä»æ§ã§ãã
ãããããå€ã®ä»æ§ãããªããžã§ã¯ããšããŠåãåºãããšã§ããã«Modelã®è²¬ä»»ãæç¢ºã«ã§ããŸãã
以äžã®ããã«å®çŸããŸãã
Model/Post/Url.php
class PostUrl { // æçš¿ã®URLãšããå€ã®ä»æ§ã以äžã®ãããªãã©ãŒãããã§ããããšãšãæçš¿IDã«äŸåããŠããããšã衚çŸã§ãã private const FORMAT = '/posts/%s'; private $postId; public function __construct(PostId $postId) { $this->postId = $postId; } public function __toString() { return sprintf(self::FORMAT, $this->postId->val()); } }
Model/Post.php
class PostModel { private $id; private $title; private $content; private $url; public function __construct (PostId $id, string $title, string $content, PostUrl $postUrl) { $this->id = $id; $this->title = $title; $this->content = $content; $this->url = $postUrl; } ... $postId = new PostId(1); $post = new Post($postId,'hoge', 'hogefuga', new PostUrl($postId)); echo $post->url(); // post/1
ãã®ããã«å€ã®ä»æ§ã¯å€ã®ä»æ§ãšããŠããã«Modelãã远ãåºãããšã§ãPostModelã¯PostModelã«ããã§ããªãä»äºã仿§ã®è¡šçŸãããŒã¿æ§é ã®å®è£ ãã«ããéäžã§ããããã«ãªããŸãã
ãµã³ãã«ã³ãŒãã§ã¯å°ããã³ãšæ¥ã«ãããããããŸãããã倧ããªã·ã¹ãã ã§è€éãªä»æ§ãæ±ããããŒã¿æ§é ã¯ãããŸã§ãã£ãŠããããèŠéãã®è¯ããã®ãšãªããããããModelããšããŠããªããžã§ã¯ãæåçãªããžã§ã¯ããšããŠããã·ã³ãšããã°ã©ããç¹ããããã³ã«ãšããŠãæ©èœããŸãã
ããããŠMVCãã¬ãŒã ã¯ãŒã¯ModelããããŒã¿ããŒã¹ãšã®ããåãã远ãåºããå€ã®ä»æ§ã远ãåºããæ®ã£ããã®ã
ãããããŒã¿æ§é ã®ãªããžã§ã¯ã衚çŸãšããŠäžçªæ£è§£ã«è¿ãModelã ãšèããŠããŸãã
ïŒããã¯DDDãã¯ãªãŒã³ã¢ãŒããã¯ãã£ãšããèšèšãã¿ãŒã³ã«ããããModelãã®èãæ¹ã§ãã
ç°¡çŽ åããããã«è²ã ãªèŠçŽ ãçããŠããã®ã§ã詳ããåŠã³ããæ¹ã¯ä»¥äžãåç §ãã ãããïŒ
ãšãªãã¯ã»ãšãŽã¡ã³ã¹ã®ãã¡ã€ã³é§åèšèš Kindleç
Clean Architectureãé人ã«åŠã¶ãœãããŠã§ã¢ã®æ§é ãšèšèš (ã¢ã¹ããŒãã¯ã³ãŽ) Kindleç
Controller
Controllerã®è²¬åã¯
- å ¥åïŒHTTPãªã¯ãšã¹ãïŒãåãåãããã§ãã¯ãã
- é©åãªåŠçç³»ãžå€ãæž¡ã
- ã¬ã¹ãã³ã¹ãè¿ã
ã®ïŒã€ã§ãã
æçš¿ããŒã¿ã«é¢ããCRUDãæ±ãè¯ããªãController.php
BadPostController extends Controller { public function store(Request $request) { // ããªããŒã·ã§ã³ãæžããŠãã£ãã $request->validate([ 'title' => 'required|unique:posts|max:255', 'body' => 'required', 'category' => 'required', 'tags' => 'required', ]); // insertçšã«ãªããžã§ã¯ããã€ãã£ãã $post = new PostEloquent(); $post->fill([ 'title' => $request->input('title'), 'body' => $request->input('body'), 'category' => $request->input('category'), 'tags' => $request->input('tags'), ]); $ret = $post->save(); // åå²ãæžããŠãã£ãã if ($post->needNotify()) { $post->notify(); } if ($ret) { return redirect('posts/index')->with(['success' => 'æåããŸãã']); } else { return redirect('posts/index')->with(['error' => '倱æããŸãã']); } } }
æçš¿ããŒã¿ã«é¢ããCRUDãæ±ãè¯ããããªController.php
PostController extends Controller { public function store(PostRequest $request, UserPostContent $userPostContent) // ããªããŒã·ã§ã³ã«ãŒã«ã¯FormRequestã«å®çŸ© { $newPostModle = $request->makePostByUserInput(); // ãŠãŒã¶ã®å ¥åããæçš¿ã¢ãã«ãçæ $ret = $userPostContent($newPostModel); // å®è¡ãããåŠçç³»ã衚çŸããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãã©ããªé¢šã«ããŒã¿ãæ°žç¶åãããéç¥ãããããªãã£ãããããªã©ã¯ããã®è²¬ä»» if ($ret) { return redirect('posts/index')->with(['success' => 'æåããŸãã']); } else { return redirect('posts/index')->with(['error' => '倱æããŸãã']); } } }
ãã®ã«ãŒãã£ã³ã°ã§å®è¡ãããåŠçç³»ãã¯ã©ã¹ã§è¡šçŸãããã£ãããšååãäžããŠ
- åŠçç³»ã®äŸåããå€
- è¿åŽãããå€
- ããããããš
ãæç¢ºã«ããŸãã
ããããããšã§Controllerã¯å ¥åã®è§£éãšã¬ã¹ãã³ã¹ã®è¿åŽã«éäžã§ããèŠéããè¯ãã§ãã
ãæçš¿ã®æ°èŠäœæãã«ã€ããŠãŠããããã¹ããæžãã±ãŒã¹ãæ³å®ããŠããåŸè
ãªãUserPostContentã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšPostModelã®ã€ã³ã¹ã¿ã³ã¹ã®ã¿è§£æ±ºããã°ãã¹ãå¯èœã§ãããåè
ã®å ŽåHTTPãªã¯ãšã¹ããšControllerãšãããããã倧ããªã€ã³ã¹ã¿ã³ã¹ãçæããå¿
èŠããããŸãã
ãã®äŸã»ã©ã®èŠæš¡ã§ããã°äŸãã°ããªããŒã·ã§ã³ãªã©ã¯ãã®ãŸãŸãã¿æžããããŠããã»ããã¡ã³ããã³ã¹ãããããšæããŸãã
ãã å²ãçªçè«ãããªãã§ããããããããšãããããã¡ããšæŽããŠãããšå®è£ ã¡ã³ããŒã«ã¯ãèªåã®æã§æ±ããããªãããšããå¿çãåããŠå šäœã綺éºã«ç¶æãããããããšããããšãããããªãšæããŸãã
å ·äœçãªäºäŸ
æåŸã«å ·äœçãªèªç€ŸäºäŸãããã€ã玹ä»ããããšæããŸãã
ãµãŒãã¹å é貚ã®è€éãªèŠä»¶
ããèªç€ŸãµãŒãã¹ã«ãŠãã¯ã¬ãžããã«ãŒãçã§æ±ºæžå¯èœãªãµãŒãã¹å é貚ãå®è£ ããéçºãããžã§ã¯ãããããŸããã
äŒç»åœåã¯åãšå䟡å€ã®ãã³ã€ã³ããšããæŠå¿µã®ã¿ã ã£ãã®ã§ãããéçšãé²ãã«ã€ãã©ãã©ãè€éåãæçµçã«ã¯ä»¥äžã®ãããªãµãŒãã¹å é貚ã®ãã¿ãŒã³ãçºçããŸããã
- åãšå䟡å€ã®ãã³ã€ã³ã
- ã³ã€ã³è³Œå ¥æã«ä»äžããããããŒãã¹ã³ã€ã³ã
- æ¯æ¥äžå®éç¡æã§ä»äžãããããã€ã³ãã
- æ¯æ¥äžæç¡æã§ä»äžãããããã±ããã
è¯ãæãã«è€éã§ãããããŒã¿æ§é ãšããŠã¯é¢çœã顿ã§ãã
åœåã¯ãã³ã€ã³ãã®ã¿ã ã£ãã®ã§ã·ã³ãã«ã«åäžã®ããŒã¿æ§é ã衚çŸã§ããã°äºè¶³ããŸããããäžèšã®ããã«ãªã£ãã®ãªãé©åãªã¯ã©ã¹æ§é ã®èšèšãè¡ããç¶æ¿é¢ä¿ããµãŒãã¹å é貚ãšããŠã®interfaceãæŽããªããšè€éãã«èµ·å ããäžå ·åãçãã§ããŸããŸãã
- ãµãŒãã¹å éè²šå ±éã®ä»æ§
- äžã€ã®ãµãŒãã¹å é貚ã®ã¿ãæã€ãŠããŒã¯ãªä»æ§
- è€æ°ã®ãµãŒãã¹å é貚ã®ã¿ãæã€ã°ã«ãŒãã§ãŠããŒã¯ãªä»æ§
äžèšã®ãããªé貚ããšã«åŸ®åŠã«ç°ãªã仿§ïŒæå¹æéãããããã§éããšããæå¹ãªååã°ã«ãŒããç°ãªããªã©ïŒãæç¶ãçã«åŠçããŠããŸããšä»¥äžã®ãããªç¶æ ã«ãªããŸãã
æç¶ãçæ±ºæž.php
// ãŠãŒã¶ãšååãåãåã£ãŠè³Œå ¥åŠçãå®è¡ãã function purchase(User $user, Item $item) { if ($item->currency_type === 'point') { $user->point = $user->point - $item->price; $user->save(); } elseif ($item-currency_type === 'coin') { ... } ... }
çæ³åœ¢ã¯ä»¥äžã§ãã
宣èšç決æž.php
// ãŠãŒã¶ãšååãåãåã£ãŠè³Œå ¥åŠçãå®è¡ãã function purchase(User $user, Item $item) { $transaction = $user->buy($item); // ã©ã®éè²šãæ¶è²»ãã¹ããã¯ãªããžã§ã¯ããç¥ã£ãŠããã®ã§purchaseåŠçãæèããªããŠãè¯ã $this->orderRepository->store($transaction); // buyã¡ãœãããè¿ãååŒæ å ±ãããŒã¿ããŒã¹ãžæ°žç¶å }
åè ã¯ãååã®çš®é¡ã«ãã£ãŠæ¶è²»ãã¹ãé貚ã®çš®é¡ãç°ãªãããšãã仿§ã®ç®¡çã«å€±æããŠãããã¡ã€ã³ã«ãŒãã³ã«ããžãã¹ããžãã¯ãæŒæŽ©ããŠããŸãã
äžæ¹åŸè ã¯ããããã·ã¹ãã ã®éèŠãªä»æ§ã«ã€ããŠã®æ å ±ããªããžã§ã¯ãã«æãããããšãåºæ¥ãŠããã®ã§ãã¡ã€ã³ã«ãŒãã³ã«ã¯ã·ã³ãã«ã«å®£èšçãªã¡ãœããã³ãŒã«ã䞊ã¶ã®ã¿ã§ãã
ãã®ããã«Modelãã·ã¹ãã äžéèŠãªä»æ§ã管çãã責任ãé©åã«è² ãã°ãä»ã®ã¬ã€ã€ãŒã«å±ããå®è£ ã®ã³ã¹ãã¯å€§ããäžãããŸãã
äŸç€ºããã³ãŒãã¯æœè±¡çã«æžããŠããŸãããå®éã«ã¯ãååŒãã®è²¬ä»»ãè² ããªããžã§ã¯ããèšèšãããã®ãªããžã§ã¯ãã«ããŠãŒã¶ãããååãã®æ å ±ãæž¡ãã°é©åãªãŠãŒã¶ã®é貚æ®é«ãšåååšåº«ã®å·®ãåŒãã®èšç®ãè¡ã£ãŠããããããªèšèšã§å¯Ÿå¿ããŠããŸãã
éçºããŒã ãžã®èšèšæŠå¿µã®æµžé
èŠæ¬ãšãªããããªå®è£ ãå ã«ããçšåºŠçšæããŠã䌌ããããªãã±ãããæ¢åå®è£ ãç䌌ããªããæžããŠã¿ãŠããããšããããæ¹ãæãéããšæããŸãã
ãã®æãäžžæãããŠããŸã£ãŠã¯ããŸããããŸããã
çµ±å¶ã®åããéçºãè¡ãã«ã¯äžè²«ããæ¹éãšåºç€ãèŠçŽãå¿ èŠã§ãã
ãããã軞ããçæ³å®çŸ©ããã£ãŠåããŠéçºã¡ã³ããŒã®ã¢ãŠããããã«å¯ŸããŠåŠ¥åœãªãã£ãŒãããã¯ãè¡ããããã«ãªããŸãã
ã³ãŒã ã¬ãã¥ãŒäŸé ŒãããŠãç¹ã«ãã£ãŒãããã¯ããããšãªããã ããªããšãã人ã¯ããã®äººãèšèšãçæ³å®çŸ©ãæŸæ£ããŠãããããããã¯ãå質ã«ã€ããŠçè§£ããŠããªãã§ãã
ãŸãã¯è²¬ä»»è ããªãŒããšã³ãžãã¢ã«é¡ããããŒã«ãæã€ãšã³ãžãã¢ããã£ãããšèŠä»¶ãææ¡ãããŒã¹ãšãªãåºç€ãæ§ç¯ããŸãããã
ãããã¡ãããšã§ããã®ãéçºãããŒãžã£ãéçºè²¬ä»»è ãšããããŒã«ã®æäœèŠä»¶ãšèããŠããã®ã§ãããçŸå®åé¡ãšããŠè«è² éçºã®ãããªä»æ§ãäžè«ãã«æµãã ããšãã£ããããªã¹ã¿ã€ã«ã®éçºãããŒãžã£ãå€ãã®ã§ã¯ãªãããšæããŠããŸãã
ãŸãšã
èŠä»¶ãè€éã ã£ããéçºè ãã¹ããŒã¯ãã«ããŒã®å€ãèŠæš¡ã®å€§ããªwebéçºã«ãããŠãã¬ãŒã ã¯ãŒã¯ãæäŸããŠããã責任åé¢ã®ä»çµã¿ã ãã§ã¯è¶³ããªã課é¡ã«ãªãããããã€ã³ããšãã®æ§é ãè§£æ±ºææ³ã«ã€ããŠæžããŠã¿ãŸããã
é·ããªã£ãŠããŸããŸããããæ¬çš¿ãæåŸãŸã§èªãã§ãã ãã£ãæ¹ã«ãŸãã¯ãããããšãããããŸããã
äœãïŒã€ã§ãåèã«ãªããã€ã³ãããã£ããªãã°å¬ããã§ãã
ä»åæ±ã£ãå å®¹ã®æ®éçã§æŠå¿µçãªéšåã¯ãä»åŸããŒã³ãŒããããŒã³ãŒããäž»æµãšãªã£ãäžçç·ã«çœ®ããŠã圹ç«ã€å 容ãšèŠãŠããŸãã
ã³ã³ãã¥ãŒã¿ãšäººãç¹ããããã³ã«ãšããŠã®ããã°ã©ãã³ã°èšèªã倱ããããšããŠããæ å ±ãæ£ããæ±ãåãããŒã¿æ§é ãèšèšããåãã¢ãžã¥ãŒã«ã«å¯ŸããŠé©åã«è²¬åãäžããŠåççãªäŸåé¢ä¿ãæ§ç¯ã管çããåãããããã¹ãã«ã解決ãã課é¡ãšããã®ã¯ãããã°ã©ã ã®èšè¿°ã³ã¹ããšé¢ä¿ã®ãªããšããã«ååšããããã§ãã
ãããŠããã®ã¹ãã«ãæããã«è¡ãããŒã³ãŒãéçºã§ã¯äœå質ãªã³ãŒãã«æ©ãŸãããããšã¯ç¡ããŠããäœåè³ªãªæ å ±ç®¡çã«ãã£ãŠçµå±ã¯ã¡ã³ããã³ã¹ãé£ãããªã£ãŠæ©ãããšã«ãªãã®ã§ãã
ããããããããã°ã©ãã³ã°èªäœã¯ç°¡åã ãã©ç¶ºéºã«æžãã®ãé£ããããšèšãé£ããã®æ£äœãã®ãã®ã§ãã
èšèªããã¬ãŒã ã¯ãŒã¯ãå®è¡ç°å¢ãéçºç°å¢ã®ãã¬ã³ãå€åã«æãããããæ®éçã§é³è åããªãããæ å ±ãæ±ããããšããŠã®ãšã³ãžãã¢ãªã³ã°ã¹ãã«ãã«æ£ããæè³ããŠããããã§ããã
æè²¬ïŒãã€ã«æ ªåŒäŒç€Ÿ å·¥è€




