ãã®èšäºã§ã¯ãäœåãã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã§åæ¢ã§ããªãçç±ãç¬èªã®ãœãªã¥ãŒã·ã§ã³ãäœæããã®ãã©ãã»ã©èŠçã ã£ããããããŠããªããç§ãã¡ã®éãç¹°ãè¿ããå Žåã«äœãåŸ ã£ãŠãããã«ã€ããŠã話ããããšæããŸãã ç«ã«èå³ããã人ã¯èª°ã§ãèããŠãã ããã
åå ãã代ããã«
Superjobã®APIã®æŽå²ã¯ãå³ããXML APIããå§ãŸããŸããã ããããç°¡æœãªJSONã«ç§»è¡ããåŸã«ãããæ£ç¢ºãªãã®ã«é¢ããè«äºã«ããããããŸãã-{successïŒtrue}ãŸãã¯{resultïŒtrue}ã JSON APIãå®è£ ããŸããã æéãçµã€ã«ã€ããŠããã®æ©èœã®äžéšãæŸæ£ããããŒã¿åœ¢åŒã«åæãããªãªãžãã«ãšã®åŸæ¹äºææ§ãç¶æããç¬èªã®ããŒãžã§ã³ã®ä»æ§ãäœæããŸããã ãŸãã«ãã®ä»æ§ã§ã¯ãAPIã®æåŸã®3çªç®ã®ããŒãžã§ã³ãå®è¡ãããããã«ãã¹ãŠã®ãµãŒãã¹ãåŸã ã«ç§»è¡ãããŸãã
ç§ãã¡ã®ã¿ã¹ã¯ã§ã¯ãAPIã®ã»ãšãã©ã®ãšã³ããã€ã³ããç¹å®ã®ãªããžã§ã¯ããåãå ¥ãããè¿ããšãã«ãJSON APIãã»ãŒå®ç§ãªãœãªã¥ãŒã·ã§ã³ã§ããããšãå€æããŸããã ãã®ä»æ§ã®äžå¿-æ¬è³ªãšãã®é¢ä¿ã ãšã³ãã£ãã£ã¯å žåçãªãã®ã§ãããå±æ§ãšé¢ä¿ã®åºå®ãããã»ãããæã¡ãæ¬è³ªçã«ã¯ã³ãŒãã§ã®äœæ¥ã«æ £ããŠããã¢ãã«ã«éåžžã«äŒŒãŠããŸãã ãšã³ãã£ãã£ã®æäœã¯ãRESTã®ååïŒHTTPãä»ãããããã³ã«ãããšãã°ãSOAPãŸãã¯JSON-RPCãªã©ïŒã«åŸã£ãŠå®è¡ãããŸãã ãªã¯ãšã¹ã圢åŒã¯ã»ãŒå®å šã«ã¬ã¹ãã³ã¹åœ¢åŒãç¹°ãè¿ãããããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã®å¯¿åœãå€§å¹ ã«ç°¡çŽ åãããŸãã ããšãã°ãå žåçãªJSON APIå¿çã¯æ¬¡ã®ããã«ãªããŸãã
{ "data": { "type": "resume", "id": 100, "attributes": { "position": "" }, "relationships": { "owner": { "data": { "type": "user", "id": 200 } } } }, "included": [ { "type": "user", "id": 200, "attributes": { "name": " " } } ] }
ããã§ã¯ãåéã¿ã€ãã®ãšã³ãã£ãã£ããããææè ã¯ãŠãŒã¶ãŒã¿ã€ãã®ãšã³ãã£ãã£ã«ãªã³ã¯ããŠããŸãã ã¯ã©ã€ã¢ã³ãããã®ãããªãšã³ãã£ãã£ãéä¿¡ããããšãæãã å Žåã圌ã¯ãªã¯ãšã¹ãæ¬äœã«ãŸã£ããåãjsonãå ¥ããŸãã
æåã®ã¹ããã
åœåãAPIã®å®è£ ã¯éåžžã«åçŽã§ããããšã³ããã€ã³ãã®åçã¯ã¢ã¯ã·ã§ã³ã§çŽæ¥åœ¢æãããã¯ã©ã€ã¢ã³ãããã®ããŒã¿ã¯ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãå®è¡ããYii1ã®å°ããªã¢ããªã³ã䜿çšããŠååŸãããããã¥ã¡ã³ãã¯æäœæ¥ã§èšå ¥ãããå¥ã®ãã¡ã€ã«ã«æ ŒçŽãããŠããŸããã
JSON APIãžã®ç§»è¡ã«ãããã¢ãã€ã³ã¯ãæ¬è³ªçã«ã¢ãã«ã®å€æïŒãããã³ã°ïŒãå¶åŸ¡ãããã©ã³ã¹ããŒãã¬ã€ã€ãŒïŒèŠæ±ã®è§£æãšå¿çã®çæïŒã管çããæ¬æ Œçãªãã¬ãŒã ã¯ãŒã¯ã«å€ãããŸããã
ã¢ãã«ããšã³ãã£ãã£ã«ãããã³ã°ããã«ã¯ã2ã€ã®è¿œå ã¯ã©ã¹ãèšè¿°ããå¿ èŠããããŸãããšã³ãã£ãã£ã®DTOãšãã¢ãã«ããã®ããŒã¿ã§DTOãåãããã€ãã¬ãŒã¿ãŒã§ãã ãã®ã¢ãããŒãã«ããããããã³ã°ããã»ã¹ã¯ååã«æè»ã«ãªããŸããããå®éã«ã¯ããã®æè»æ§ã¯æªã§ããããšãå€æããŸãããæéãçµã€ã«ã€ããŠããã€ãã¬ãŒã¿ãŒã¯ã³ããŒã¢ã³ãããŒã¹ãã倧ãããªãå§ããåã¢ãã«ãå¥ã®2ã€ã®ã¯ã©ã¹ãéå§ããå¿ èŠæ§ãã³ãŒãããŒã¹ã®èšåŒµã«ã€ãªãããŸããã
ãã©ã³ã¹ããŒãå±€ãçæ³ããããé¢ããŠããŸããã éçºè ã¯ãJSON APIã®å éšæ§é ã«ã€ããŠçµ¶ããèããããšãäœåãªããããŸãããã¢ãã«ãããã³ã°ã®å Žåãšåæ§ã«ãããã»ã¹ãå®å šã«å¶åŸ¡ããããšã«ãããã¢ã¯ã·ã§ã³ããã¢ã¯ã·ã§ã³ã«ã»ãšãã©åäžã®ã³ãŒãããã©ãã°ããå¿ èŠãçããŸããã
JSON APIã§åäœãããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãžã®åãæ¿ããæ€èšãå§ããŸããã JSON API Webãµã€ãã«ã¯ããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã®ããŸããŸãªèšèªã§ã®ä»æ§å®è£ ã®ããªãå°è±¡çãªãªã¹ãããããŸãã ãã®èšäºãæžããŠããæç¹ã§ã¯ãPHPã§ãµãŒããŒéšåãå®è£ ããŠãããããžã§ã¯ãã18ãããŸãããããã®ãã¡ã®ã©ããç§ãã¡ã«ã¯é©ããŠããŸããã§ããã
- 第äžã«ããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ãç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³ãšåãåé¡ããã¹ãŠãããŸãããäœåãªã³ãŒããå€ãããèªååãã»ãšãã©ãããŸããã å Žåã«ãã£ãŠã¯ãç¹å®ã®èŠä»¶ãã¢ãã«ïŒããšãã°ãã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£
ïŒã«èª²ããããã³ãŒãããªã¥ãŒã ã§ã¯æ·±å»ãªãªãã¡ã¯ã¿ãªã³ã°ãçºçããå¯èœæ§ããããŸããã ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ãåŠçããã«ã¯ããããã«ããŠããéžæãããœãªã¥ãŒã·ã§ã³ãYiiã«æ¥ç¶ããã¢ããã¿ãŒãäœæããå¿
èŠããããŸãã
- 第äºã«ãå§åçãªæ°ã®ãµãŒãããŒãã£ãœãªã¥ãŒã·ã§ã³ã1察1ã®ãããã³ã°ããµããŒãããŠããŸããã1ã€ã®ã¢ãã«ãããã°ãããã1ã€ã®ãšã³ãã£ãã£ã«å€ããããšãã§ããŸãã ããã¯ãã¢ãã«å
ã®ããŒã¿ãã¯ã©ã€ã¢ã³ãã«æäŸããã圢åŒã§ä¿åãããŠããéåžžã®ã±ãŒã¹ã§ãããå®éã«ã¯åžžã«ããã§ãããšã¯éããŸããã ããšãã°ãå±¥æŽæžã¢ãã«ã«ã¯é£çµ¡å
ã®å±æ§ããããŸãããã¯ã©ã€ã¢ã³ãã¯ç¹å®ã®æ¡ä»¶äžã§ã®ã¿ãããã®é£çµ¡å
ãåä¿¡ã§ããŸãã é£çµ¡å
ãå±¥æŽæžèªäœã®æ¬è³ªã«é¢é£ããå¥ã®ãšã³ãã£ãã£ã«ããŠã1ã€ã®ã¢ãã«ãè€æ°ã®ãšã³ãã£ãã£ã«å€æããããšã¯çŽ æŽãããããšã§ããããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããã¯æŸèæãä»ããŠã®ã¿å®è¡ã§ããŸãã
- 第äžã«ãããŒã¿ããŒã¹ããã¢ãã«ãéžæããŠã¯ã©ã€ã¢ã³ãã«éä¿¡ãããšã³ããã€ã³ããäœæããã¿ã¹ã¯ã«çŽé¢ããŠããããã°ã©ããŒãæ¯ååãã¿ã€ãã®ã³ãŒããäœæããå¿
èŠããªãããã«ãæšæºãšã³ããã€ã³ãã®éçºãå¯èœãªéãç°¡çŽ åãããã£ãã®ã§ãã ãã ãããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ã¯DBALãšã®çµ±åãæäŸããŸããã§ããã
- æåŸã«ã第4ã«ãããã¥ã¡ã³ããšãã¹ãã®èšè¿°ãåçŽåããããšãæã¿ãŸãããããµãŒãããŒãã£ãœãªã¥ãŒã·ã§ã³ã®å€§éšåã¯ããšã³ãã£ãã£ãæã€å±æ§ãšé¢ä¿ã«é¢ããæ å ±ãæäŸããŸããã§ããã
åã³æ±ºå®ãæžãå§ããå¿ èŠæ§ãæããã«ãªããŸãã:)
ãã¬ãŒã ã¯ãŒã¯éçº
以åã®éçºããã³ãµãŒãããŒãã£ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ãåæããåŸãæ°ãããã¬ãŒã ã¯ãŒã¯ãã©ãããã¹ãããšããããžã§ã³ã圢æããŸããã
- ãŸããDTOãšãã€ãã¬ãŒã¿ãŒãèšè¿°ãã代ããã«ãæ§æå šäœã§ãããã³ã°å šäœãèšè¿°ããããšã«ããŸããã
- éçºè ã«ã¯ç¥ãããŠããŸãããããã®èšå®ã¯PHPã³ãŒãã«ã³ã³ãã€ã«ãããŠããå¿ èŠããããPHPã³ãŒãã¯ãšã³ãã£ãã£ããã€ãã¬ãŒãããããã«äœ¿çšãããŸãã
- JSON APIã䜿çšãããã¹ãŠã®äœæ¥ã¯ãèå°è£ã§å®è¡ããå¿ èŠããããŸãããéåžžã®ãšã³ããã€ã³ãã§ã¯ããã¹ãŠã®äœæ¥ã¯ããžãã¹ããžãã¯ã®èšè¿°ãšã¢ãã«ã®ååŸã«éå®ããããšæ³å®ãããŠããŸããã
- æåŸã«ãåè¿°ã®ããã«ããœãªã¥ãŒã·ã§ã³ãDBALãããã¥ã¡ã³ããããã³ãã¹ããšçµ±åããããšèããŸããã
ã³ã¢
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ãã³ã³ãã€ã«ããããã€ãã¬ãŒã¿ãŒãã€ãŸãã¢ãã«ãåããŠãšã³ãã£ãã£ãæ§ç¯ãããªããžã§ã¯ãã«åºã¥ããŠããŸãã ãã€ãã¬ãŒã¿ãŒã¯ã¿ã¹ã¯ã«å¯ŸåŠããããã«ã©ã®ãããªç¥èãå¿ èŠã§ããïŒ ãŸãæåã«ã圌ã¯ã©ã®ã¢ãã«ãšã©ã®ãšã³ãã£ãã£ãæ§ç¯ãããããç¥ããªããã°ãªããŸããã ãšã³ãã£ãã£ãæã€ããããã£ãšé¢ä¿ãããã³ãœãŒã¹ã¢ãã«ã®ããããã£ãšé¢ä¿ã«ã©ã®ããã«é¢ä¿ããããç解ããå¿ èŠããããŸãã
ãã®ãããªãã€ãã¬ãŒã¿ãŒã®èšå®ã説æããŠã¿ãŸãããã èšå®åœ¢åŒã¯YAMLã§ããããã¯ãèšè¿°ãããããèªã¿ãããã解æããããã§ãïŒ èªå® ã§symfony / yamlã䜿çšããŸãã ïŒã
entities: TestEntity: classes: - TestModel attributes: id: type: integer accessor: '@getId' mutator: '@setId' name: type: string accessor: name mutator: name relations: relatedModel: type: TestEntity2 accessor: relatedModel relatedModels: type: TestEntity3[] accessor: '@getRelatedModels'
ããã§ãTestEntityãšã³ãã£ãã£ã¯TestModelã¢ãã«ããçµã¿ç«ãŠãããŸãã ãšã³ãã£ãã£ã«ã¯2ã€ã®å±æ§ããããŸããidã¯getIdã²ãã¿ãŒããååŸãããnameã¯nameããããã£ããååŸãããŸãã ãšã³ãã£ãã£ã«ã¯ã2ã€ã®é¢ä¿ããããŸããTestEntity2åã®ãšã³ãã£ãã£ã§æ§æãããåäžã®relatedModelãšãTestEntity3ã®ãšã³ãã£ãã£ã§æ§æãããè€æ°ã®relatedModelã§ãã
ãã®æ§æã䜿çšããŠã³ã³ãã€ã«ããããã€ãã¬ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ãã
class TestEntityHydrator extends Hydrator { public static function getName(): string { return 'TestEntity'; } protected function getClasses(): array { return [Method::DEFAULT_ALIAS => TestModel::class]; } protected function buildAttributes(): array { return [ 'id' => (new CompiledAttribute('id', Type::INTEGER)) ->setAccessor( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray) { return $modelArray[Method::DEFAULT_ALIAS]->getId(); } ) ) ->setMutator( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray, $value) { $modelArray[Method::DEFAULT_ALIAS]->setId($value); } ) ), 'name' => (new CompiledAttribute('name', Type::STRING)) ->setAccessor( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray) { return $modelArray[Method::DEFAULT_ALIAS]->name; } ) ) ->setMutator( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray, $value) { $modelArray[Method::DEFAULT_ALIAS]->name = $value; } ) ) ->setRequired(false), ]; } protected function buildRelations(): array { return [ 'relatedModel' => (new CompiledRelation('relatedModel', TestEntity2Hydrator::getName()))->setAccessor( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray) { return $modelArray[Method::DEFAULT_ALIAS]->relatedModel; } ) ), 'relatedModels' => (new CompiledRelation('relatedModels', TestEntity3Hydrator::getName()))->setAccessor( new MethodCallable( Method::DEFAULT_ALIAS, function (array $modelArray) { return $modelArray[Method::DEFAULT_ALIAS]->getRelatedModels(); } ) )->setMultiple(true), ]; } }
å®éããã®å·šå€§ãªã³ãŒãã¯ãã¹ãŠãæ¬è³ªçãªããŒã¿ã®ã¿ãèšè¿°ããŠããŸãã åæããŠããããææžãã§æžããŠãã ããããããžã§ã¯ãå ã®åãšã³ãã£ãã£ã§ãããããã¯çŽ æŽãããããšã§ã¯ãªãã§ãããã
äžèšã®ãã¹ãŠãæ©èœããããã«ã¯ãæ§æããŒãµãŒãããªããŒã¿ãŒãã³ã³ãã€ã©ãŒã®3ã€ã®ãµãŒãã¹ãå®è£ ããå¿ èŠããããŸããã
ããŒãµãŒã¯èšå®ã®å€æŽã«åŸãããšã«ã³ããããïŒ symfony / configããããå©ããŠãããŸããïŒããã®ãããªå€æŽãæ€åºãããå Žåããã¹ãŠã®èšå®ãã¡ã€ã«ãåèªã¿èŸŒã¿ããããããããŒãžããŠããªããŒã¿ãŒã«æž¡ããŸããã
ããªããŒã¿ãŒã¯ãæ§æã®æ£ç¢ºæ§ããã§ãã¯ããŸããïŒæåã«ãjsonã¹ããŒãã®å¯Ÿå¿ããã§ãã¯ããŸãããããã¯ãæ§æïŒããã§ã¯justinrainbow / json-schemaã䜿çšããŸãã ïŒã«ã€ããŠèª¬æãã次ã«ãèšåãããã¹ãŠã®ã¯ã©ã¹ããããã®ããããã£ãããã³ã¡ãœããã®ååšã確èªããŸãã
æåŸã«ãã³ã³ãã€ã©ãŒã¯æ€èšŒãããæ§æãååŸããããããPHPã³ãŒããã³ã³ãã€ã«ããŸããã
DBALãšã®çµ±å
æŽå²çãªçç±ããããããžã§ã¯ãã§ã¯2ã€ã®DBALïŒYii1 ActiveRecordãšDoctrineã®æšæºçãªDBALïŒãè¿ãã«ãããäž¡æ¹ã®ãã¬ãŒã ã¯ãŒã¯ãåéã«ãããã£ãã®ã§ãã çµ±åã«ãããMapperã¯ããŒã¿ããŒã¹ããç¬ç«ããŠããŒã¿ãåä¿¡ããä¿åã§ããããšãç解ãããŸããã
ãããå®çŸããããã«ããŸãèšå®ã«å°ããªå€æŽãå ããå¿ èŠããããŸããã äžè¬çãªå Žåãã¢ãã«å ã®æ¥ç¶ã®ååã¯ããã®æ¥ç¶ãè¿ãã²ãã¿ãŒãŸãã¯ããããã£ã®ååãšç°ãªãå ŽåãããããïŒããã¯ç¹ã«Doctrineã«åœãŠã¯ãŸããŸãïŒããã®ååãŸãã¯ãã®DBALæ¥ç¶ãç¥ã£ãŠããååã§Mapperã«äŒããããšãã§ããå¿ èŠããããŸããã ãã®ãããéä¿¡ã®èª¬æã«ãã©ã¡ãŒã¿ãŒinternalNameãè¿œå ããŸããã åŸã«ãåãinternalNameãå±æ§ã«è¡šç€ºããããããããããŒã¯ç¬ç«ããŠãã£ãŒã«ãéžæãå®è¡ã§ããŸããã
internalNameã«å ããŠããšã³ãã£ãã£ãå±ããDBALã«é¢ããç¥èãæ§æã«è¿œå ããŸãããã¢ããã¿ãã©ã¡ãŒã¿ã§ããµãŒãã¹ã®ååãæå®ãããããããŒãDBALãšããåãã§ããããã«ããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ãšããã§ãã
interface IDbAdapter { /** * Statement . * * @param string $className * @param mixed $context * @param array $relationNames * * @return IDbStatement */ public function statementByContext(string $className, $context, array $relationNames): IDbStatement; /** * Statement . * * @param string $className * @param array $attributes * @param array $relationNames * * @return IDbStatement */ public function statementByAttributes(string $className, array $attributes, array $relationNames): IDbStatement; /** * . * * @param string $className * * @return mixed */ public function create(string $className); /** * . * * @param mixed $model */ public function save($model); /** * . * * @param mixed $parent * @param mixed $child * @param string $relationName */ public function link($parent, $child, string $relationName); /** * . * * @param mixed $parent * @param mixed $child * @param string $relationName */ public function unlink($parent, $child, string $relationName); }
DBALãšã®å¯Ÿè©±ãç°¡çŽ åããããã«ãã³ã³ããã¹ãã®æŠå¿µãå°å ¥ããŸããã ã³ã³ããã¹ãã¯ç¹å®ã®ãªããžã§ã¯ãã§ããããããåä¿¡ãããšãDBALã¯ã©ã®ã¯ãšãªãå®è¡ããå¿ èŠãããããç解ããå¿ èŠããããŸãã ActiveRecordã®å ŽåãCDbCriteriaã¯Doctrine-QueryBuilderã®ã³ã³ããã¹ããšããŠäœ¿çšãããŸãã
DBALããšã«ãIDbAdapterãå®è£ ããç¬èªã®ã¢ããã¿ãŒãäœæããŸããã é©ãããããŸãããããšãã°ãYii1ã®ååšå šäœã«ããã£ãŠãããããçš®é¡ã®æ¥ç¶ã®ä¿åããµããŒãããåäžã®æ¡åŒµæ©èœãèšè¿°ãããŠããªãããšãå€æããŸãããç§ã¯ç¬èªã®ã©ãããŒãäœæããå¿ èŠããããŸããã
ããã¥ã¡ã³ããšãã¹ã
èªå® ã§ã¯ãçµ±åãã¹ãã«Behatã䜿çšããããã¥ã¡ã³ãã«Swaggerã䜿çšããŠããŸãã ã©ã¡ãã®ããŒã«ããã€ãã£ãã«JSONã¹ããŒãããµããŒãããŠãããããMapperãµããŒããåé¡ãªãçµ±åã§ããŸãã
Behatã®ãã¹ãã¯ã¬ãŒãã³ã§æžãããŠããŸãã åãã¹ãã¯äžé£ã®ã¹ãããã§ãããåã¹ãããã¯èªç¶èšèªã®æã§ãã
JSON APIãšMapperã®ãµããŒããBehatã«çµ±åããæé ãè¿œå ããŸããã
# When I have entity "resume" And I have entity attributes: | name | value | | profession | | # And I have entity relationship "owner" with data: | name | value | | id | 100 | # , resume Then I send entity via "POST" to "/resume/" and get entity "resume"
ãã®ãã¹ãã§ã¯ãåéãšã³ãã£ãã£ãäœæãããã®å±æ§ãšé¢ä¿ãèšå ¥ãããªã¯ãšã¹ããéä¿¡ããŠã¬ã¹ãã³ã¹ãæ€èšŒããŸãã åæã«ãã«ãŒãã³å šäœãèªååãããŠããŸãããªã¯ãšã¹ãã®æ¬æãäœæããå¿ èŠã¯ãããŸãããBehatã®ãã«ããŒããããè¡ããããäºæ³ãããã¬ã¹ãã³ã¹ã®JSONã¹ããŒãã¯Mapperã«ãã£ãŠçæããããããèšè¿°ããå¿ èŠã¯ãããŸããã
ããã¥ã¡ã³ãã䜿çšãããšãç¶æ³ã¯ããèå³æ·±ããã®ã«ãªããŸãã Swaggerã®JSONã¹ããŒããã¡ã€ã«ã¯å ã ãYAMLãœãŒã¹ãããã®å Žã§çæãããŸããããã§ã«è¿°ã¹ãããã«ãYAMLã¯åãJSONãããã¯ããã«ç°¡åã«èšè¿°ã§ããŸãããSwaggerã¯JSONã®ã¿ãç解ããŸãã YAMLãã¡ã€ã«ã®ã³ã³ãã³ãã ãã§ãªããããããŒããã®ãšã³ãã£ãã£ã®èª¬æãæçµçãªJSONã¹ããŒãã«å ¥ãããã«ããã®ã¡ã«ããºã ãè£è¶³ããŸããã ãããã£ãŠãããšãã°ããã©ãŒã ã®ãªã³ã¯ãç解ããããã«Swaggerã«æããŸããã
$ref: '#mapper:resume'
ãŸãã¯ïŒ
$ref: '#mapper:resume.collection.response'
Swaggerã¯ãåéãšã³ãã£ãã£ãªããžã§ã¯ããŸãã¯ãµãŒããŒå¿çãªããžã§ã¯ãå šäœããããããåéãšã³ãã£ãã£ã®ã³ã¬ã¯ã·ã§ã³ã§ã¬ã³ããªã³ã°ããŸããã ãã®ãããªãªã³ã¯ã®ãããã§ãããããŒã®æ§æãå€æŽããããšããã«ãããã¥ã¡ã³ããèªåçã«æŽæ°ãããŸããã
çµè«
å€å€§ãªåªåãæã£ãŠãéçºè ã®äœæ¥ã楜ã«ããããŒã«ãäœæããŸããã ããããªãšã³ããã€ã³ããäœæããã«ã¯ãæ§æã§ãšã³ãã£ãã£ãèšè¿°ããæ°è¡ã®ã³ãŒããã¹ããŒããã ãã§ååã§ãã ãã¹ããšããã¥ã¡ã³ããæžãéã®ã«ãŒãã³ãèªååããããšã§ãæ°ãããšã³ããã€ã³ãã®éçºã«ãããæéãç¯çŽã§ããMapperèªäœã®æè»ãªã¢ãŒããã¯ãã£ã«ãããå¿ èŠã«å¿ããŠæ©èœãç°¡åã«æ¡åŒµã§ããŸããã
èšäºã®åé ã§è¿°ã¹ãåºæ¬çãªè³ªåã«çããæãæ¥ãŸãã-èªè»¢è»ãäœãã®ã«è²»çšã¯ããããŸãããïŒ ãããŠãããªãã¯ããªãèªèº«ã®ãã®ãäœãå¿ èŠããããŸããïŒ
Mapperã®éäžçãªéçºãã§ãŒãºã«ã¯ãçŽ3ãæããããŸããã åŒãç¶ãæ°ããæ©èœãè¿œå ããŸãããããã»ã©éäžçã§ã¯ãããŸããã äžè¬ã«ãç§ãã¡ã¯çµæã«æºè¶³ããŠããŸããããããŒã¯ãããžã§ã¯ãã®æ©èœãèæ ®ããŠèšèšãããŠãããããå²ãåœãŠãããã¿ã¹ã¯ããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«ããŸãåŠçããŸãã
ç§ãã¡ã®éãè¡ãã¹ãã§ããïŒ ããªãã®ãããžã§ã¯ãããŸã è¥ããã³ãŒãããŒã¹ãå°ããå Žåãããªãã®ããã«èªè»¢è»ãæžãããšã¯äžåœãªæéã®ç¡é§ã«ãªãå¯èœæ§ãéåžžã«é«ããæè¯ã®éžæã¯ãµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãçµ±åããããšã§ãã ãã ããã³ãŒããé·å¹Žã«ããã£ãŠèšè¿°ãããŠãããæ·±å»ãªãªãã¡ã¯ã¿ãªã³ã°ãå®è¡ããæºåãã§ããŠããªãå Žåã¯ãç¬èªã®æ±ºå®ã«ã€ããŠæ確ã«æ€èšããå¿ èŠããããŸãã éçºã®åæã®å°é£ã«ãããããããå°æ¥ã®æéãšåŽåãå€§å¹ ã«ç¯çŽã§ããŸãã