ã¿ãªããããã«ã¡ã¯ïŒ æè¿ã®Superjob IT Meetupã§ãç§
㯠Superjobã§äœçŸäžäººã®èŽè¡ãšå€ãã®ç°ãªããã©ãããã©ãŒã ãæã€ãããžã§ã¯ãã®ããã«APIãéçºããŠããããš
ã«ã€ããŠè©±ããŸããã
ãã®èšäºã§ã¯ãäœåãã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã§åæ¢ã§ããªãçç±ãç¬èªã®ãœãªã¥ãŒã·ã§ã³ãäœæããã®ãã©ãã»ã©èŠçã ã£ããããããŠããªããç§ãã¡ã®éãç¹°ãè¿ããå Žåã«äœãåŸ
ã£ãŠãããã«ã€ããŠã話ããããšæããŸãã ç«ã«èå³ããã人ã¯èª°ã§ãèããŠãã ããã

åå ãã代ããã«
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 { public function statementByContext(string $className, $context, array $relationNames): IDbStatement; public function statementByAttributes(string $className, array $attributes, array $relationNames): IDbStatement; public function create(string $className); public function save($model); public function link($parent, $child, 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ãæããããŸããã åŒãç¶ãæ°ããæ©èœã远å ããŸãããããã»ã©éäžçã§ã¯ãããŸããã äžè¬ã«ãç§ãã¡ã¯çµæã«æºè¶³ããŠããŸããããããŒã¯ãããžã§ã¯ãã®æ©èœãèæ
®ããŠèšèšãããŠãããããå²ãåœãŠãããã¿ã¹ã¯ããµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãããã¯ããã«ããŸãåŠçããŸãã
ç§ãã¡ã®éãè¡ãã¹ãã§ããïŒ ããªãã®ãããžã§ã¯ãããŸã è¥ããã³ãŒãããŒã¹ãå°ããå Žåãããªãã®ããã«èªè»¢è»ãæžãããšã¯äžåœãªæéã®ç¡é§ã«ãªãå¯èœæ§ãéåžžã«é«ããæè¯ã®éžæã¯ãµãŒãããŒãã£ã®ãœãªã¥ãŒã·ã§ã³ãçµ±åããããšã§ãã ãã ããã³ãŒããé·å¹Žã«ããã£ãŠèšè¿°ãããŠãããæ·±å»ãªãªãã¡ã¯ã¿ãªã³ã°ãå®è¡ããæºåãã§ããŠããªãå Žåã¯ãç¬èªã®æ±ºå®ã«ã€ããŠæç¢ºã«æ€èšããå¿
èŠããããŸãã éçºã®åæã®å°é£ã«ãããããããå°æ¥ã®æéãšåŽåã倧å¹
ã«ç¯çŽã§ããŸãã