
Habréã«ã¯ãããŸããŸãªãã¯ãããžãŒãèšèªãAPIãªã©ã«é¢ããèšäºããããããããŸãããéçºã®æäžã«ããããã°ã©ããŒã¯ããããã®ç®çãå¿ããŠããŸãããšããããããŸãã以äžã§ã¯ãéçºäžã«æãéèŠãªããšãå¿ããªãæ¹æ³ã説æããŸãã
ãã®èšäºã§ã¯ãããŸããŸãªã¢ãããŒããçµã¿åãããŠãPHPã§ããžãã¹ããžãã¯ã䜿çšããŠäœæ¥ãç·šæããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããã§ã¯ãã³ã³ãããŒã©ãŒã¬ã€ã€ãŒã«æ²¿ã£ããµããžã§ã¯ãããžãã¯ã®æ¡æ£ã«é¢é£ããPHPãã¬ãŒã ã¯ãŒã¯ã®åé¡ãåé¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
æŠèª¬ãããœãªã¥ãŒã·ã§ã³ãäœããã®ç¹å¹è¬ã§ããããšãä¿èšŒãããã®ã§ã¯ãããŸããã以äžã®ãã¹ãŠã¯ãäžè¬çãªåé¡ã解決ããããã®ãªãã·ã§ã³ã®1ã€ã«ãããŸããã é·æãšçæã®äž¡æ¹ãããããã®ã¢ãããŒãã¯ãã®äž»ãªã¿ã¹ã¯ã«å¯ŸåŠããŸãã
äžè¬çãªPHPãã¬ãŒã ã¯ãŒã¯ã§ããžãã¹ããžãã¯ãæäœããæ¹æ³ã«ã€ããŠå°ã
éåžžã®ç¶æ³
æã人æ°ã®ãããã¬ãŒã ã¯ãŒã¯ãèŠããšãMVCã¢ãŒããã¯ãã£ãã¿ãŒã³ã«åºã¥ããŠããŸãã ãã®ãããªããžãã¹ããžãã¯ãæŽçããããã®ããŒã«ã¯ãããŸãããããã¹ãŠãåçŽãªç²æªåãäœæããããã«ãããŸãã
ã»ãšãã©ã®å Žåã«èŠãããæšæºçãªç¶æ³ã¯è²§åŒ±ãªã¢ãã«ã§ããããšãã°ãUserModelã¯ã©ã¹ã¯åãªãå±æ§ã®ã»ããã§ãããããžãã¯ãå«ãŸããŠããŸããã ããžãã¹ããžãã¯ã¯ã³ã³ãããŒã©ãŒã¬ã€ã€ãŒã«å«ãŸããŠããŸãã
ã³ã³ãããŒã©ã¯ããã¡ã€ã³ã¢ãã«ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªãããšãµãŒãã¹å±€ã®éã®äœãã«å€ãããŸãã å ¥åããŒã¿ãæ€èšŒããããŒã¿ããŒã¹ããã¢ãã«ãšã³ãã£ãã£ãååŸãããããã®ãšã³ãã£ãã£ã®ããžãã¹ããžãã¯ãå®è£ ããŸãã
ãããééã£ãŠãããšèšã£ãŠããã®ã§ã¯ãªããå Žåã«ãã£ãŠã¯å®è¡å¯èœãªã¢ãããŒãã§ãã ããžãã¹ããžãã¯ã®è€éãªã¢ãŒããã¯ãã£ãªãã§éçºããå ŽåïŒ
- ã·ã³ãã«ãªããžãã¹ããžãã¯
- mvpãäœæããã«ã¯
- ãããã¿ã€ããäœæãããšã
ãã®ãããªç¶æ³ããªãå Žåã¯ãã¢ãŒããã¯ãã£ãšããã®ã¢ãŒããã¯ãã£ã®ããžãã¹ããžãã¯ã®å Žæã«ã€ããŠèããå¿ èŠããããŸãã
æŽç·Žãããããžãã¹ããžãã¯
ããžãã¹ããžãã¯ãååã«è€éãªå Žåã2ã€ã®æšæºãœãªã¥ãŒã·ã§ã³ããããŸãã
ãã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªãã
ãã¬ãŒã ã¯ãŒã¯ããããžãã¹ããžãã¯ãåé¢ããã«ã¯ããããåå¥ã®ãšã³ãã£ãã£ã«ãã䟡å€ããããŸãã ãã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªããã䜿çšããŠãç¹å®ã®ãŠãŒã¶ãŒãªã¯ãšã¹ããåŠçããå€æ°ã®ã¹ã¯ãªããã»ãããäœæã§ããŸãã
ããšãã°ãåçãã¢ããããŒãããå¿ èŠãããå Žåã¯ãåçãã¢ããããŒãããã¹ã¯ãªãããäœæã§ããŸãã ããã°ã©ã ã§ãå¥ã®ã¯ã©ã¹ã«å²ãåœãŠãããšãã§ããŸãã
PhotoUploadScript
ã¯ã©ã¹PhotoUploadScript
{
ãããªãã¯é¢æ°runïŒïŒ
{
/ *åçã¢ããããŒãã¹ã¯ãªããã®å®è£ * /
}
}
{
ãããªãã¯é¢æ°runïŒïŒ
{
/ *åçã¢ããããŒãã¹ã¯ãªããã®å®è£ * /
}
}
ãã®ã¢ãããŒãã®è©³çŽ°ã«ã€ããŠã¯ããäŒæ¥åããœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ããšããæ¬ãåç §ããŠãã ããããã¹ãŠã®é·æãšçæã«ã€ããŠèª¬æããŠããŸãã
ãã¡ã€ã³ã¢ãã«
ãã¡ã€ã³ã¢ãã«ãå®è£ ãããšãäºæ ã¯ããã«è€éã«ãªããŸãã ããžãã¹ããžãã¯ãæ€èšããæ確ã«åãããã責任ãæã€ãšã³ãã£ãã£ãåºå¥ããå¿ èŠããããŸãã å€ãã®èœãšãç©ŽããããŸããããã¯ããµããžã§ã¯ããšãªã¢ã®ãã¡ãµãŒããæŽçããæ¹æ³ãšãããžãã¹ãšã³ãã£ãã£éã®æ¥ç¶ã絡ã¿åã£ãã¢ããªã±ãŒã·ã§ã³ã®äœæãåé¿ããæ¹æ³ãªã©ã§ãã
ããšã³ã¿ãŒãã©ã€ãºãœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ããšããæ¬ã§ã¯ãããžãã¹ããžãã¯ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšããŠæ©èœããå ±éã®æ©èœïŒUserServiceãOrderServiceãªã©ïŒã§ã°ã«ãŒãåãããè€æ°ã®ãµãŒãã¹ã§æ§æããããµãŒãã¹ã¬ã€ã€ãŒã¬ã€ã€ãŒãå°å ¥ããããšãææ¡ãããŠããŸãã
ãã®ã¢ãããŒãã¯ãæžç±ãäŒæ¥åããœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãããã³ç§ãå人çã«èªãããšã匷ããå§ãããæžç±ãSubject-Oriented DesignïŒDDDïŒãã§è©³çŽ°ã«æ€èšãããŠããŸãã
ç§ãã¡ã®ç©èª
ããããã¹ãŠå§ãŸã£ãæ¹æ³
2014幎ã«ãããžã§ã¯ããéå§ããããšã決å®ãããèšèªãæè¡ãã©ã€ãã©ãªãªã©ãéžæããããšã§çåãçããŸããã
éžæã¯PHPã«å§ããããŸããããæ¢åã®ãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšãæŸæ£ããããšã決å®ãããŸããã ãã®æ ¹æ ã¯æãããããæ°ããè£ ãã§åœŒå¥³ã«æ°ããåœãäžããããšã«ããŸããã
ç§ãã¡ã®çµç¹ã§ã¯ããã¹ããããžãã¹ããžãã¯ããã¶ã€ã³ãã¿ãŒã³ãªã©ã®éèŠæ§ãç解ããŠãããããç§ãã¡ã管çããããŒã«ãäœæããPHPã§ããžãã¹ããžãã¯ãæäœã§ããããã«ããããšã«ããŸããã
建ç¯ãèŸæž
åºç€ã¯å€å±€ã¢ãŒããã¯ãã£ãæ¡çšããŸããã éåžžã«äžè¬çã§æ¡å€§ãããã¹ããŒã ãèæ ®ãããšã3ã€ã®ã¬ã€ã€ãŒãåºå¥ã§ããŸãã

DDDã®ãBig Blue BookãããArchitecture of Corporate Software Applicationsãã®äžéšãåãäžããå¿ èŠã«å¿ããŠããããã¹ãŠãåŠçããŸããã
ã€ã³ã¿ãŒãã§ãŒã¹
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãç§ãã¡ã®å Žåãå€çããäž»é¡é åãžã®ã¢ã¯ã»ã¹ãæ åœããå±€ã§ãã
çŸåšã2çš®é¡ã®ã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã
APIã¯ãViewãšControllerã§æ§æãããRESTful APIã§ãã
CLI-ã³ãã³ãã©ã€ã³ããããžãã¹ããžãã¯ãåŒã³åºãããã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒã¿ã¹ã¯ã¯ã©ãŠã³ããã¥ãŒã®ã¯ãŒã«ãŒãªã©ïŒã
衚瀺ãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¬ã€ã€ãŒã®ãã®éšåã¯éåžžã«åçŽã§ããPHPãããžã§ã¯ãã¯APIã®ã¿ã§ããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæããªãããã§ãã
ãããã£ãŠããã³ãã¬ãŒããšã³ãžã³ã§ã®äœæ¥ãå«ããå¿ èŠã¯ãªããjsonãšããŠã®ãã¥ãŒãæäŸããŸãã
å¿ èŠã«å¿ããŠããã®æ©èœãæ¡åŒµãããã³ãã¬ãŒããšã³ãžã³ã®ãµããŒããè¿œå ããããŸããŸãªå¿ç圢åŒïŒxmlãªã©ïŒãå°å ¥ã§ããŸããããŸã ãã®ãããªããŒãºã¯ãããŸããã ãã®åçŽåã«ãããã¢ãŒããã¯ãã£ã®ããéèŠãªéšåã«ããå€ãã®æéãå²ãããšãã§ããŸããã
ã³ã³ãããŒã©ãŒ
ã³ã³ãããŒã©ã«ã¯ãã¡ã€ã³ããžãã¯ãå«ããªãã§ãã ããã ã³ã³ãããŒã©ãŒã¯ãåã«ã«ãŒã¿ãŒããèŠæ±ãåä¿¡ããèŠæ±ãã©ã¡ãŒã¿ãŒã䜿çšããŠé©åãªã¢ãã«ã€ã³ã¿ãŒãã§ã€ã¹ãåŒã³åºããŸãã 圌ã¯ããã€ãã®å°ããªå€æãè¡ã£ãŠã¢ãã«ãšéä¿¡ã§ããŸãããããžãã¹ããžãã¯ã¯ãããŸããã
ã¢ãã«
ã¢ãã«ã¬ã€ã€ãŒã§ã¯ãã¢ãŒããã¯ãã£ã®ä»ã®éšåããã®åé¢ã«éåããããšãªããã»ãŒãã¹ãŠã®ãµããžã§ã¯ããšãªã¢ãå±éã§ãããšã³ãã£ãã£ã®åºæ¬ã»ãããéžæãããŸããã
ã¢ãã«ã®3ã€ã®äž»ãªäžè¬åèŠçŽ ãç¹å®ãããŸããã
ãšã³ãã£ãã£ã¯ããã©ã¡ãŒã¿ã®ãªã¹ãã®åœ¢åŒã§äžé£ã®ç¹æ§ãæã¡ãé¢æ°ã®åœ¢åŒã§åäœãããšã³ãã£ãã£ã§ãã
ã³ã³ããã¹ãã¯ããšã³ãã£ãã£ãçžäºäœçšããã·ããªãªã§ãã
ãªããžããªã¯ããšã³ãã£ãã£ãæ ŒçŽããããã®æœè±¡åã§ãã
ä¿ç®¡
ã¹ãã¬ãŒãžã¬ã€ã€ãŒã«ã¯ãã¢ãã«ã®ã©ã®ãšã³ãã£ãã£ãããŒã¿ããŒã¹ã«ä¿åããããããŒã¿ããŒã¹ããããŒãããæ¹æ³ãç¥ã£ãŠããäžé£ã®ããããŒãããŸãã
詳现çè«
ãã¥ãŒã³ã³ãããŒã©ãŒ
ãã©ãããã©ãŒã ã®ãã®éšåã¯ãå€éšããããžãã¹ããžãã¯çšã®APIãç·šæããŸãã ããã¯å€ãã®èŠçŽ ã§æ§æãããŠããŸãããç解ããããã«ããã€ãã説æã§ããŸãã
ã«ãŒã¿ãŒ -é©åãªã³ã³ãããŒã©ãŒã¡ãœãããžã®httpèŠæ±ã®ã«ãŒã¿ãŒïŒãã¹ãŠãæšæºã§ãïŒã
Viewã¯ãæ¬è³ªçã«ValueObjetãšããŠæž¡ãããã¢ãã«ïŒããã§ãããžãã¹ããžãã¯ã«é¢ããå€ãã®ç¥èããã¥ãŒã«æäŸããŸããïŒããjsonã«æž¡ãããã¢ãã«ã®å¿çã®ã³ã³ããŒã¿ãŒã§ãã åŸæ¥ã®MVCãã¥ãŒã§ã¯ãã¢ãã«ããçŽæ¥æŽæ°ãåãåããŸãããã³ã³ãããŒã©ãŒãä»ããŠæŽæ°ãåãåããŸãã
ã³ã³ãããŒã©ãŒã¯ãã¢ãã«ã€ã³ã¿ãŒãã§ã€ã¹ãé ãã¬ã€ã€ãŒã§ãã ã³ã³ãããŒã©ãŒã¯ãhttpèŠæ±ãã¢ãã«ã®å ¥åãã©ã¡ãŒã¿ãŒã«å€æããã¢ãã«ã¹ã¯ãªãããåŒã³åºããå®è¡çµæãåãåãã衚瀺çšã«ãã¥ãŒãè¿ããŸãã
ãã®éšåã«ã¯ããžãã¹ããžãã¯ã¯å«ãŸããŠããããæ°ããAPIãäœæããå¿ èŠããªãéãããããžã§ã¯ãäžã«å€æŽãããããšã¯ãããŸããã ã³ã³ãããŒã©ãŒå±€ãèšåŒµããããã³ã³ãã¯ãã§ã·ã³ãã«ãªãŸãŸã«ããŸãã
ã¢ãã«
次ã«ãããžãã¹ããžãã¯ãå ·äœåããæãéèŠã§äŸ¡å€ã®ããèŠçŽ ã«ã€ããŠèª¬æããŸãããã
ã¢ãã«ã®äž»èŠãªèŠçŽ ã§ãããšã³ãã£ãã£ãã³ã³ããã¹ããããã³ãªããžããªãããã«è©³ããèããŠã¿ãŸãããã
ãšã³ãã£ãã£
æœè±¡ãšã³ãã£ãã£ãŒã¯ã©ã¹
abstract class Entity { protected $_privateGetList = []; protected $_privateSetList = [ 'ctime', 'utime']; protected $id = 0; protected $ctime; protected $utime; public function getId() { return $this->id; } public function setId( $id) { $this->id = $this->id == 0? $id: $this->id; } public function getCtime() { return $this->ctime; } public function getUtime() { return $this->utime; } public function __call( $name, $arguments) { if( strpos( $name, "get" ) === 0) { $attrName = substr( $name, 3); $attrName = preg_replace_callback( "/(^[AZ])/", create_function( '$matches', 'return strtolower($matches[0]);'), $attrName); $attrName = preg_replace_callback( "/([AZ])/", create_function( '$matches', 'return \'_\'.strtolower($matches[0]);'), $attrName); if( !in_array( $attrName, $this->_privateGetList)) return $this->$attrName; } if( strpos( $name, "set" ) === 0) { $attrName = substr( $name, 3); $attrName = preg_replace_callback( "/(^[AZ])/", create_function( '$matches', 'return strtolower($matches[0]);'), $attrName); $attrName = preg_replace_callback( "/([AZ])/", create_function( '$matches', 'return \'_\'.strtolower($matches[0]);'), $attrName); if( !in_array( $attrName, $this->_privateSetList)) $this->$attrName = $arguments[0]; } } public function get( $name) { if( !in_array( $name, $this->_privateGetList)) return $this->$name; } public function set( $name, $value) { if( !in_array( $name, $this->_privateSetList)) $this->$name = $value; } static public function name() { return get_called_class(); } }
ãšã³ãã£ãã£ã¯ããã¡ã€ã³ã®ãšã³ãã£ãã£ã§ããããšãã°ããŠãŒã¶ãŒã泚æãè»ãªã©ã§ãã ãã®ãããªãšã³ãã£ãã£ã¯ãã¹ãŠãèå¥åãç»é²æéãäŸ¡æ Œãé床ãªã©ã®ãã©ã¡ãŒã¿ãŒãæã€ããšãã§ããŸãã åºæ¬ã¯ã©ã¹Entityã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠäœæ¥ãæäŸããŸããåäœã¯ãéçºè ã«ãã£ãŠç¶æ¿ã¯ã©ã¹ã§æ¢ã«æ±ºå®ãããŠããŸãã
EntityãããŒã¿ããŒã¹ã«ä¿åããã«ã¯ãã©ã¡ãŒã¿ãŒã®ãªã¹ããå¿ èŠã§ãããã¢ãã«ã¯ãã®ä¿åã«ã€ããŠäœãç¥ããŸããã ã€ã³ãã©ã¹ãã©ã¯ãã£ã¬ãã«ã§ã¯ãã¢ãã«ãšã³ãã£ãã£ãããŒã¿ããŒã¹ã«ä¿åããæ¹æ³ãç¥ã£ãŠããããããŒãããŸãã
ãã©ãããã©ãŒã ã®Entityã®èå¥åã¯åºæ¬çãªãã©ã¡ãŒã¿ãŒã§ãããåããªããžã§ã¯ãã¯ã©ã¹å ã®ç°ãªããšã³ãã£ãã£ãäžæã«èå¥ããããšãã§ããŸãã
ãã詳现ã«ã¯ãç§ãã¡ã®ãšã³ãã£ãã£ã¯ããšãªãã¯ã»ãšãŽã¡ã³ã¹ã®æ¬ã§èª¬æãããŠãããšã³ãã£ãã£ã«éåžžã«äŒŒãŠãããšèšããŸãã
Evansã«ãããšããœãããŠã§ã¢ã·ã¹ãã å ã®ãªããžã§ã¯ãã®èå¥ã¯æãéèŠãªã¿ã¹ã¯ã®1ã€ã§ãã Evansã¯ããªããžã§ã¯ãã®å±æ§ã ãã§èå¥ãéæãããããã§ããªãããšãæ確ã«ããŠããŸãã
ãœãããŠã§ã¢ã·ã¹ãã å ã®ãªããžã§ã¯ããèå¥ããããšãã§ããç¹æ§ãšèŠãªãããšãã§ãããã®ïŒå±æ§ããªããžã§ã¯ãã®ã¯ã©ã¹ãåäœã ãšã³ãã£ãã£ãéçºãããšãããããã®ç¹æ§ããå§ããŸããã
å±æ§ã¯ãšã³ãã£ãã£ã«ãã£ãŠç°ãªãå ŽåããããŸãããã»ãšãã©ãã¹ãŠã®äººã«åºæã®ããŒã¿ããŒã¹å ã®èå¥åãèå¥ããŠããŸãã OOPãšéçºèšèªã«ãã£ãŠæäŸãããç¶æ¿ã®ãããã§ããªããžã§ã¯ãã¯ã©ã¹ãèšå®ããŸãã åäœã¯ãåã¯ã©ã¹ã®ã¡ãœããã«ãã£ãŠæå®ãããŸãã
ã³ã³ããã¹ã
æœè±¡ã¯ã©ã¹Context
abstract class Context { protected $_property_list = null; function __construct( \foci\utils\PropertyList $property_list) { $this->_property_list = $property_list; } abstract public function execute(); static public function name() { return get_called_class(); } }
ã³ã³ããã¹ãã¯ããšã³ãã£ãã£ãçžäºäœçšããã·ããªãªã§ãã ããšãã°ãããŠãŒã¶ãŒç»é²ãã«ã¯åå¥ã®ã³ã³ããã¹ããããããã®ã³ã³ããã¹ãã®åäœã¯æ¬¡ã®ããã«ãªããŸãã
- ã³ã³ããã¹ããå®è¡ããç»é²çšã®ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã å ¥åæã«ãã³ã³ããã¹ãã¯åçŽãªãã©ã¡ãŒã¿ãŒïŒintãstringãtextãªã©ïŒã®ãªã¹ããåãåããŸãã
- ãã©ã¡ãŒã¿ã®æ£ç¢ºæ§ã®æ€èšŒãè¡ãããŸãã æ€èšŒã¯ãµããžã§ã¯ããšãªã¢å°çšã§ããhttpãªã¯ãšã¹ãã¯ããã§ã¯ãã§ãã¯ããŸããã
- ãŠãŒã¶ãŒã®äœæã
- ãŠãŒã¶ãŒãä¿åããŠããŸãã ããããµããžã§ã¯ãé åã®äžéšã§ããäž»ãªããšã¯ããã®ãŠãŒã¶ãŒãã©ãããã©ã®ããã«ä¿åããããæœè±¡åããããšã§ãã ããã§ã¯ããªããžããªã䜿çšããŠä¿åãæœè±¡åããŸãã
- ã¡ãŒã«éç¥ãéä¿¡ããŸãã
- ã³ã³ããã¹ãå®è¡ã®çµæãè¿ããŸãã çµæãè¿ãããã«ãç¹å¥ãªã¯ã©ã¹ContextResultããããŸããããã«ã¯ãã³ã³ããã¹ãã®æ£åžžãªå®è¡ã®ãµã€ã³ãšãçµæãå«ãããŒã¿ãŸãã¯ãšã©ãŒã®ãªã¹ããå«ãŸããŸãã ïŒView-Controllerã¬ãã«ã§ã¯ãã¢ãã«ãšã©ãŒã¯httpãšã©ãŒã«å€æãããŸãïŒ
ã³ã³ããã¹ãã¯ã»ãšãã©çŽç²ãªãã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªããã§ãããããã€ãã®äŸå€ããããŸãã Fowlerã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªãããŸãã¯ãã¡ã€ã³ã¢ãã«ãéããŠããžãã¹ããžãã¯ãå®è£ ããäŸãæäŸããŸãã ãã¡ã€ã³ã¢ãã«ã䜿çšããå Žåãå ±éã®æ©èœïŒUserServiceãMoneyServiceãªã©ïŒã«åºã¥ããŠãµãŒãã¹ãäœæããããµãŒãã¹ã¬ã€ã€ãŒã䜿çšããããšããå§ãããŸãã ãã®å Žåãã¢ãã«ãšã³ãã£ãã£ã貧匱ã«ããªãå Žåããã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªããã¯åããµãŒãã¹ã¬ã€ã€ãŒãšããŠæ©èœã§ããŸãã
ããšãã°ãé貧匱ãªãŠãŒã¶ãŒã®ãŠãŒã¶ãŒé¢é£ã³ã³ããã¹ãïŒUserRegContextãUserGetContextãUserChangePasswordContextãªã©ïŒã®ã»ããã¯ãUserServiceïŒãµãŒãã¹ã¬ã€ã€ãŒïŒãšã»ãŒåçã§ãã å€ãã®ããžãã¹ããžãã¯ãåãããã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªãããšèŠãªãããšãã§ããã³ã³ããã¹ãããããŸãããäžéšã®ãšã³ãã£ãã£æ©èœãåŒã³åºãã ãã®ã³ã³ããã¹ããããããã¹ãŠã®ããžãã¹ããžãã¯ãã³ã³ããã¹ãããé ãããŠãããããã§ã¯ãããã¯ãµãŒãã¹å±€ã«è¿ããªã£ãŠããŸãã
ãããããè€éãªããžãã¹ããžãã¯ã®å ŽåãDDDã·ã¹ãã ã¢ãŒããã¯ãã£ãçŽç²ãªåœ¢ã«ããããããžãã¹ããžãã¯ãããã»ã©è€éã§ã¯ãªããäœæãã¯ãšãªãæŽæ°ãªã©ã®æšæºã¹ã¯ãªããã§æ§æãããå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªããã䜿çšããŠããžãã¯ãæŽçã§ããŸãã
ãªããžããª
æ±çšãªããžããªã¯ã©ã¹
class Repository { function add( \foci\model\Entity &$entity) { $result = $this->_mapper->insert( $entity); return $result; } function update( \foci\model\Entity &$entity) { $result = $this->_mapper->update( $entity); return $result; } function delete( \foci\model\Entity &$entity) { $result = $this->_mapper->deleteById( $entity->getId()); return $result; } }
ãªããžããªã¯ãããŒã¿ããŒã¹å ã®ãšã³ãã£ãã£ã®ã¹ãã¬ãŒãž/åé€/æŽæ°/æ€çŽ¢ãæŽçããããã®ããžãã¹ããžãã¯ã®æœè±¡åã§ãã å ·äœçãªãªããžããªã¯å ·äœçãªãšã³ãã£ãã£ãšé£æºããŸããããšãã°ãUserRepositoryã¯ãŠãŒã¶ãŒãšé£æºããŸãã
ããŒã¿ä¿å
ããŒã¿ã¹ãã¬ãŒãžã¯ãããããŒã䜿çšããŠè¡ãããŸãã ãšã³ãã£ãã£ãæäœããããã®åºæ¬çãªæ©èœãå«ãäžè¬åãããããããŒã¯ã©ã¹ããããŸãã
æ±çšããããŒã¯ã©ã¹
æœè±¡ã¯ã©ã¹ããããŒ
{
ä¿è·ããã$ _connection;
ä¿è·ããã$ _table;
é¢æ°__constructïŒæ¥ç¶$æ¥ç¶ïŒ
{
$ this-> _ connection = $ connection;
}
æœè±¡ä¿è·é¢æ°_createEntityFromRowïŒ$è¡ïŒ;
æœè±¡ãããªãã¯é¢æ°æ¿å ¥ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
æœè±¡ãããªãã¯é¢æ°ã®æŽæ°ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
æœè±¡ãããªãã¯é¢æ°åé€ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
ãããªãã¯é¢æ°getTableNameïŒïŒ
{
return $ this-> _ table;
}
}
{
ä¿è·ããã$ _connection;
ä¿è·ããã$ _table;
é¢æ°__constructïŒæ¥ç¶$æ¥ç¶ïŒ
{
$ this-> _ connection = $ connection;
}
æœè±¡ä¿è·é¢æ°_createEntityFromRowïŒ$è¡ïŒ;
æœè±¡ãããªãã¯é¢æ°æ¿å ¥ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
æœè±¡ãããªãã¯é¢æ°ã®æŽæ°ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
æœè±¡ãããªãã¯é¢æ°åé€ïŒ\ foci \ model \ EntityïŒ$ entityïŒ;
ãããªãã¯é¢æ°getTableNameïŒïŒ
{
return $ this-> _ table;
}
}
ç¹å®ã®ãšã³ãã£ãã£ã«å¯ŸããŠããã®ãšã³ãã£ãã£ãããŒã¿ããŒã¹ã«ä¿åããæ¹æ³ãããŒã¿ããŒã¹ããããŒãããæ¹æ³ãåé€ããæ¹æ³ãç¥ã£ãŠããç¬èªã®ç¹å®ã®ããããŒãäœæãããŸãïŒãã ããå®éã«ããŒã¿ããŒã¹ããäœããåé€ããã®ã¯æªãç¿æ £ãªã®ã§ãã»ãšãã©ã®å Žåãåé€æžã¿ãšããŒã¯ããã ãã§ãïŒå€æŽããã
ãããã£ãŠãã¢ãã«ã«Userã¯ã©ã¹ãããå Žåãããã«å¿ããŠUserMapperã¯ã©ã¹ãäœæãããŸãã ããŒã¿ããŒã¹ãæäœããããžãã¯ã¯å¥ã®ã¬ã€ã€ãŒã«é 眮ãããå¿ èŠã«å¿ããŠç°¡åã«çœ®ãæããããšãã§ããŸãã
ã¢ãã«ãšã³ãã£ãã£ã¯ããããŒã«ã€ããŠã¯äœãç¥ããŸããããéã«ãããããŒã¯ãã¹ãŠãã¢ãã«ãšã³ãã£ãã£ã«ã€ããŠç¥ã£ãŠããŸãã
äžè¬åãããã¹ããŒã
å
šäœå

ããã§ã¯ããã©ãããã©ãŒã ã®éåžžã«äžè¬çãªã¯ã©ã¹æ§é ã«ã€ããŠèª¬æããŸãããéèŠåºŠã®äœãå°ããªã¯ã©ã¹ã®å€ãã¯çç¥ãããŠããŸãã
ãã§ã«ããããã®ããã«ããã®åºæ¬æ§é ã®ã¿ã«å€ãã®èŠçŽ ãå«ãŸããŠããŸãã ç¹å®ã®ãããžã§ã¯ãã§ã¯ãç¹å®ã®ããžãã¹ã¿ã¹ã¯ãå®è£ ããã³ã³ããã¹ãã¯ã©ã¹ããšã³ãã£ãã£ããªããžããªãããããŒã®ãã¹ãå šäœãããããã¹ãŠã«è¿œå ãããŸãã
å³ã®ConfigãšPropertyListã¯ã誰ãã䜿çšãããŠãŒãã£ãªãã£ãšã³ãã£ãã£ã§ãã
å°ãç·Žç¿ïŒã»ãã®å°ãïŒ
çè«ã¯åªããŠããŸãããããããã¹ãŠå®è·µããæ¹æ³ãèŠãŠã¿ãŸãããã 財åã®å人äŒèšã®ç³è«æžãäœæããã¿ã¹ã¯ããããšããŸãã çšèªéã®ãµã³ãã«çšèªéïŒå®çŸ©ã¯ãã€ã³ãããŸãããä»ã®ãšããã¯ãã¹ãŠã·ã³ãã«ã§ãïŒïŒãéãäºç®ããŠãŒã¶ãŒã補åããµãŒãã¹ãã«ã¬ã³ããŒ
次ã«ãæ確ã«ããããã«ãããã€ãã®ãŠãŒã¶ãŒã·ããªãªãäœæããéæšæºã®ãã®ã䜿çšããŸãã ååã®è³Œå ¥-ç§ãã¡ã®è³Œå ¥ã¯ãåã«ãéãäžæ°ã«åãæ¶ããšããäºå®ã§ãããšèããŸãã ã«ã¬ã³ããŒã«åŸã£ãŠãµãŒãã¹ã®æ¯æããèšå®ããŸã-ããã¯ã説æä»ãã®å®æçãªãéã®ååŽã§ãã
ãšã³ãã£ãã£ãéžæããŸãïŒMoneyãBudgetãUserãProductãServiceãCalendarã
ãŠãŒã¶ãŒã·ããªãªã«ã¯3ã€ã®ã³ã³ããã¹ãããããŸãã
æåã®ã³ã³ããã¹ãã¯ãåã«è£œåãè³Œå ¥ããããšã§ãã
BuyOrderContex
- å ¥åïŒããšãã°ãããŒã¯ã³ïŒã«ãã£ãŠããŒã¿ããŒã¹ãããŠãŒã¶ãŒãååŸããŸã
- æ°ãã補åãååŸãŸãã¯äœæããŸã
- æå®ããéé¡ã®è£œåè³Œå ¥ãã»ããã¢ããããããã«Budgetã«æ瀺ããŸãã
æ®ãã¯ããè€éã§ã2çªç®ã®ãŠãŒã¶ãŒã·ããªãªã¯2ã€ã®ã³ã³ããã¹ãã«åå²ãããŸããæåã®ã·ããªãªã§ã¯ãéããã€ååŽããããèšå®ãã2çªç®ã®ã·ããªãªã§ã¯ååŽãè¡ããŸãã
SetSchedulePayForServiceContext
- å ¥åïŒããšãã°ãããŒã¯ã³ïŒã«ãã£ãŠããŒã¿ããŒã¹ãããŠãŒã¶ãŒãååŸããŸã
- æ°ãããµãŒãã¹ãååŸãŸãã¯äœæããŸã
- æå®ãããæ¥ä»ã®ãµãŒãã¹ãµãŒãã¹ã®ãéãåŒãèœãšãã«ã¬ã³ããŒã«ã€ã³ã¹ããŒã«ããŸã
SchedulePayForServiceContext
- çŸåšãµãŒãã¹ã«æéããããã©ãããã«ã¬ã³ããŒã§ç¢ºèªããŸã
- ãéãååŽããå¿ èŠããããµãŒãã¹ãããŒãããŸã
- ãµãŒãã¹æéãè«æ±ããŸã
ãã§ã«ãã®å°ããªäŸã§ã¯ããã®ã¢ãããŒãã®é·æãšçæãããã€ãèŠãããŸãïŒããšãã°ãç°ãªãã³ã³ããã¹ãã§ã®ããžãã¯ã®è€è£œãããã¯ãæ¬ãäŒæ¥ãœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£ãã«ããæžãããŠããŸãïŒã
ãããã«
ç§ãã¡ã®å®è·µ
æ©èœåé¢
ã¢ããªã±ãŒã·ã§ã³å šäœãã³ã³ããã¹ãã«åå²ãããšãç°ãªããµãŒããŒã«ç°¡åã«é åžã§ããŸãã
ããšãã°ããŠãŒã¶ãŒç»é²ã«é¢é£ä»ããããã³ã³ããã¹ããããããããã®ã°ã«ãŒãå šäœãç°¡åã«ååŸããŠãä»ã®ã¢ããªã±ãŒã·ã§ã³ãäžæããããšãªãå¥ã®ãµãŒããŒã«è»¢éã§ããŸãã
ã³ã³ããã¹ããã³ã³ããã¹ããåŒã³åºããŸã
ã³ã³ããã¹ãã¯ã³ã³ããã¹ããåŒãèµ·ããå¯èœæ§ããããããè€éãªãã§ãŒã³ãæ§ç¯ã§ããŸãã ãã®ææ³ã¯ã»ãšãã©äœ¿çšãããŸããã ãŸãããã®ã¢ãããŒãã«ã¯å€ãã®èœãšãç©Žãããããã®ãããªäœ¿çšãçŠæ¢ããèšç»ããããŸãã
ã¯ã©ãŠã³ã¿ã¹ã¯
å®è¡ã®åäœãšããŠã®ã³ã³ããã¹ãã«ãããã©ãããã§ãåŒã³åºãããšãã§ããŸãã ã¿ã¹ã¯ã®å ãšããŠã³ã³ããã¹ããèµ·åããããžãã¯ã¯ãããã«åºã¥ããŠããŸãã
SPA
ç§ãã¡ã®ãããžã§ã¯ãã®1ã€ã¯ãã¯ã©ã€ã¢ã³ãéšåãJavaScriptã§å®å šã«èšè¿°ãããRESTfull APIãä»ããŠPHPã®ãµãŒããŒéšåãšããåããããµã€ãã§ãã éçºãéå§ãããšãããããèšç»ããããšããããŸããã§ãããããµãŒããŒãšããŠã®ãã©ãããã©ãŒã ã§SPAã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããã®æ©äŒã¯éåžžã«äŸ¿å©ã§ããããšãå€æããŸããã
ãã¹ãäž
ãã¹ãŠã®ã³ãŒãã¯ãã¹ãã§ã«ããŒãããŸãã 次ã®2çš®é¡ã®ãã¹ãã䜿çšããŸãã
- Configãªã©ã®ã¯ã©ã¹ã®ãŠããããã¹ã
- APIãžã®ãªã¯ãšã¹ãã«å¯Ÿããåãå ¥ããã¹ãã
èšç»
- ç§ãã¡ã¯ãéçºã®ããåºç¯ãªæ®åãéåžžã«æ¬ ããŠããŸãã ãã¹ãŠã¯å éšäœ¿çšå°çšã«æžãããŠãããããã«ã¯æ¬ ç¹ããããŸãã
- è² è·ã®é«ããããžã§ã¯ãã«ã¯ååãªäŸµå ¥ããããŸããã ãã§ã«ããã€ãã®å®çšçãªåçšãããžã§ã¯ãããããŸãããããããé«è² è·ãšåŒã¶ããšã¯ã§ããŸããã
- ãããŸã§ã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããããžãã¯ã¯ãããŸãèæ ®ãããŠããŸããã ãã®æç¹ã§ãçŸåšãã«ãã»ã«åã¢ãã«ã«ããããªéåããããŸãã å°æ¥çã«ã¯ãããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ããæœè±¡åããäœæ¥åäœãå°å ¥ããäºå®ã§ãã
- ãã¹ãã¯äž»ã«APIãã³ã³ããã¹ããã¹ããè¡ãèšç»ãã«ããŒããŠããŸãã ããã«ããããµããžã§ã¯ãé åãåå¥ã«ãã¹ãã§ããŸãã
çµæãšããŠäœãåŸãã®ã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ããããžãã¹ããžãã¯ãæ確ã«åé¢ããŠãã¢ããªã±ãŒã·ã§ã³ãäœæããããã®æè»ãªãã©ãããã©ãŒã ã
- ç§ãã¡ã®éçºã«ãã£ãŠå®å šã«å¶åŸ¡ãããããã¯è«äºã®çãšãªã£ãŠããåé¡ã®æè¡çåé¡ã解決ããäžã§å€ãã®å©ç¹ããããããŸãã
- æ°ããéçºè ãããââãžã§ã¯ãã«ãã°ããåå ã§ããããã«ãããããç¥ããããã¶ã€ã³ãã¿ãŒã³ã«åºã¥ãã¢ãŒããã¯ãã£ã
- æ°ãããããžã§ã¯ãã§ã¯å¿ããããã¡ã§ãæ¢åã®ãããžã§ã¯ãã§ã®äœ¿çšã暡玢ããªããå®èšŒæžã¿ã®èšèšã¢ãããŒããé©çšããè±å¯ãªçµéšã
çµè«
äžè¬çã«ãå®äºããäœæ¥ã®çµæã«æºè¶³ããŠããŸãã æžããããã©ãããã©ãŒã ã¯ç§ãã¡ã®åé¡ã解決ããŸãã ããã«ãããããžãã¹ããžãã¯ãæè»ã«å®è£ ã§ããéçºãå€§å¹ ã«ç°¡çŽ åãããŸãã æ¹åãšæ¡åŒµã®ããã®å€ãã®èšç»ããããŸãã
PSïŒPHPãã¬ãŒã ã¯ãŒã¯ã®ãµããžã§ã¯ãé åã®åé¡ã解決ããããã®ãã®ãããªã¢ãããŒããã³ãã¥ããã£ã«ãšã£ãŠèå³æ·±ããã®ã§ããå ŽåããªãŒãã³ãœãŒã¹ãæºåããŠæºåããããšãã§ããŸãã
PSSïŒããã«ãã¹ãŠããã§ã«ããã®ã«ããªãèªè»¢è»ãå¿ èŠãªã®ããšãããã¬ãŒãºãäºèŠããŸãã ããã«ã€ããŠè°è«ããçç±ã¯ãªããšæããŸãããããç§ãã¡ã®ã¢ãããŒãã§ãããããŸããããŸããã
PSSïŒè¿èŠªçžå§Šã®ãã©ã³ã¶ã¯ã·ã§ã³ã¹ã¯ãªãããšãã¡ã€ã³ã¢ãã«ããããŠãªãããžãã¹äžã®åé¡ã解決ããããã®æè»ãªããŒã«ãäœã£ãŠå ¥æããªãã®ããšããçåãäºèŠããŸãã