ããŒã1.ãµãŒããŒããŒã2.ã¯ã©ã€ã¢ã³ãããŒã3.çªç¶å€ç°ããŒã4.æ€èšŒã çµè«ãã®èšäºã¯å¹
åºãèªè
ã察象ãšããŠãããPHPãšJavascriptã®åºæ¬çãªç¥èã®ã¿ãå¿
èŠã§ãã ããã°ã©ãã³ã°ãè¡ã£ãŠããŠãç¥èªAPIã«ç²ŸéããŠããå Žåã¯ããã®éãã§ãã
åœåããã®èšäºã§ã¯ãGraphQLã®ç¹åŸŽçãªæ©èœãšå®éã«ééããRESTful APIã®èª¬æã®ã¿ãæ³å®ããŠããŸããããæçµçã«ã¯ããã€ãã®ããŒãã§ããªã¥ãŒã ãã¥ãŒããªã¢ã«ã«ãªããŸããã
ãããŠããã«ãGraphQLããã¹ãŠã®ç
æ°ã®äžèœè¬ã§ãããRESTful APIãã©ãŒãšã¯èŠãªããªãããšãä»ãå ããŸãã
ç§ãã¡ã¯èª°ã§ããïŒ
ç§ãã¡ã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããäŒç€Ÿã§ãããååãšããŠããããã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯iOSïŒãã¡ããïŒãAndroidãããã³Webçšã®ã¯ã©ã€ã¢ã³ãããããŸãã å人çã«ãç§ã¯ãã®äŒç€Ÿã§PHPã§ãµãŒããŒåŽãæžããŠããŸãã
èæ¯
ããã¯ãã¹ãŠã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã®éçºãå®äºãããšããäºå®ããå§ãŸããŸããïŒå®äºããæç¹ã§ãã¢ããªã±ãŒã·ã§ã³ã®éçºãçµäºããããšã¯ã§ããŸãããã¢ããªã±ãŒã·ã§ã³ã¯éäžã§äžæãããããã§ãïŒã 幞ããªããšã«ãå瀟ã¯éçºè
ããã¯ãããžãŒã®éžæã«å¶éããŠãããïŒåœç¶ãåççãªç¯å²å
ã§ïŒãéå»ã«çºçããåé¡ãåé¿ããããã«ç¹å®ã®å€æŽãå ããããšã決å®ãããŸããã çµå±ã®ãšãããããªããç¥ã£ãŠããããã«ãããªããããªããããããšãç¶ããã°ãããªãã¯ããªããåãåããã®ãåãåãç¶ããŸãã
RESTful APIã®åé¡
RESTã«å€§ããªåé¡ã¯ãããŸããã§ããããç§ã¯å®æçã«ãããã®1ã€ã«ééããŸããã å®éãç§ãã¡ã®ãããžã§ã¯ãã®éçºè
ã¯é«ãè³æ Œãæã£ãŠãããããåéçºè
ãç¹å®ã®ã¬ãã«ã§èªåã®åéã®å°é家ã§ãããšèããŠããã®ã¯ãã®ããã§ãã APIã¯ãããã¯ãšã³ããšããã³ããšã³ãã®ã¹ãã·ã£ãªã¹ããã€ãªããã¯ãããžãŒã®èãã¹ã¬ããã§ãããéçºæ¹æ³ã«é¢ããå€ãã®è«äºã®åå ã§ãã
ãããžã§ã¯ãæ§é
ããšãã°ãå
žåçãªããŒã¿æ§é ãèããŠã¿ãŸãããã

ããã§ã¯ãå®éã«ã¯ããã®ãããªããŒãã«ã«ã¯20以äžã®ãã£ãŒã«ãããããGraphQLã®äœ¿çšãããã«é
åçã§æ£åœåãããããšãç解ããå¿
èŠããããŸãã ãªãæ£ç¢ºã«ãç§ã¯èšäºã§èª¬æããããšããŸãã
ããã¯ãšã³ãéçºè
ãäœæãããAPIã¡ãœããã¯äœã§ããïŒ
ãã¡ããããµãŒããŒåŽã®éçºè
ã¯ãå
æ¬çã§å
æ¬çãªãªããžã§ã¯ããšå¯èœãªéãäžè²«æ§ã®ããæ¹æ³ã§APIã¡ãœãããèšè¿°ããããšèããŠããŸãã äŸïŒ
GET / api / user /ïŒid{ id email firstName lastName createDate modifyDate lastVisitDate status }
GET / api / address /ïŒid { id userId street zip cityId createDate modifyDate status }
GET / api / city /ïŒid { id name }
...ãªã© ãã®ãããªã¢ãŒããã¯ãã£ãæžãããšã¯ãåçŽã§é«éã§ããã ãã§ãªãïŒããããã¹ãŠãäœããã®è¶³å Žã«ãªã£ãŠãããšèšããªãéãïŒãããã¯ãŸããã¢ãŒããã¯ãã£äžããã³çŸåŠçã«ããçŸãããããæ£ç¢ºã§ãïŒå°ãªããšãéçºè
èªèº«ã¯ããèããŠããŸãïŒã æè¯ã®å Žåãããã¯ãšã³ãã¯ãã¹ãããããªããžã§ã¯ãã«åæãããããaddressIdã®ä»£ããã«ããã¹ããããã¢ãã¬ã¹ãªããžã§ã¯ããŸãã¯ïŒã1察å€ãæ¥ç¶ã®å ŽåïŒã¢ãã¬ã¹ã®é
åãè¿ãããŸãã
UIéçºè
ãåŒã³åºãããAPIã¡ãœããã¯äœã§ããïŒ
ã¯ã©ã€ã¢ã³ãéçºè
ã¯ãçããŠãã人ã
ïŒã¢ããªã±ãŒã·ã§ã³ã®ãŠãŒã¶ãŒïŒãšãã®ããŒãºã«å°ãè¿ã¥ããŠããŸãããã®çµæãåãããŒã¿ã®ç°ãªãã»ãããå¿
èŠãªã¢ããªã±ãŒã·ã§ã³å
ã«ããã€ãã®å ŽæïŒå€ããèªãå¿
èŠããããŸãïŒããããŸãã ãããã£ãŠã圌ã¯åæ©èœèŠçŽ ãã¡ãœããã«ãã£ãŠæã€ããšãæãã§ããŸãïŒ
GET / api / listOfUsersForMainScreen [ { firstName lastName dateCreated city street } ... ]
...çã
ã ãã¡ããããã®ãããªæ¬²æ±ã¯ãäœæ¥ãåæžãããã ãã§ãªããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæ¹åããããšãã欲æ±ã«ãã£ãŠå®å
šã«æ£åœåãããŸãã ãŸããUIã¯3ã€ã§ã¯ãªã1ã€ã®åŒã³åºããè¡ããŸãïŒæåã®ãŠãŒã¶ãŒã次ã«äœæã次ã«åžïŒã 第äºã«ããã®æ¹æ³ã«ãããå€ãã®ïŒå€ãã®å Žåããªãã®ïŒåé·ããŒã¿ãååŸããå¿
èŠããªããªããŸãã åæã«ãdateCreatedã¯ãããŒã¿ããŒã¹ã®ãã£ãŒã«ãããååŸããå
ã®åœ¢åŒã§ã¯ãªãã人éã®åœ¢åŒã§è¿ãããšãéåžžã«æãŸããã§ãïŒããã§ãªãå Žåã¯ãUnixæéãå€æããå¿
èŠããããŸãïŒã
ç§ã¯èšŒäººã§ãããæã«ã¯åå è
ã§ãã£ãçŽäºãçãŸããã®ã¯ãããã«åºã¥ããŠããŸãã åªããéçºè
ã¯ãäºãã®ããŒãºãéšåçã«æºããããã«åŠ¥åãæ±ãããã¡ãã劥åãèŠã€ããŸãã ãã ããããšãã°ãããã³ããšã³ãã1ã€ãšããã¯ãšã³ãã2ã€ããå Žåãåç¬ã§ã«ãªã¹ãæ§ãæ倧éã«é«ãããã¹ãŠã®å€äº€ã¹ãã«ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ã©ã€ããµã€ã¯ã«å
šäœã§1ååŒã³åºãããç¡æå³ãªã¡ãœããã®èšè¿°ãé²ããå¿
èŠããããŸãã
GraphQLãšã¯äœã§ããïŒãªãåé¡ã解決ããå¿
èŠãããã®ã§ããïŒ
GraphQLã«æ
£ããŠããªã人ã®ããã«ã5ã10å以å
ã§éããããšããå§ãããŸãã
ãã®ããŒãžã«ã¢ã¯ã»ã¹ããŠãGraphQLã®çšéãç解ããŠ
ãã ãã ã
ãªã圌ã¯äžèšã®åé¡ã解決ããã®ã§ããïŒ GraphQLã䜿çšããå ŽåããµãŒããŒéçºè
ã¯ã¢ãããã¯ãšã³ãã£ãã£ãšãªã¬ãŒã·ã§ã³ã·ããã奜ããªããã«èšè¿°ããUIã¯ç¹å®ã®èŠçŽ ã®ããŒãºã«å¿ããŠã«ã¹ã¿ã ã¯ãšãªãæ§ç¯ããããã§ãã ãããŠãçŸã¯ååã«é€ãäžããããçŒã¯ç¡å·ã§ããããã«èŠããŸããã幞ããªããšã«ãç§ãã¡ã¯çæ³çãªäžçã«äœãã§ããããç§ãã¡ã¯ãŸã é å¿ããªããã°ãªããŸããã ãããããŸãæåã«ã
ã³ãŒããèŠããŠ
Habréã«ã¯ãPHPãšGraphQLã®åéãäœãæ¹æ³ã«ã€ããŠã®
è¯ãèšäºããããŸãããããããå€ãã®æçšãªããšãåŠã³ãç¹°ãè¿ããè¬ããŸãããã®èšäºã®äž»ãªãã€ã³ãã¯åºæ¬ãæããããšã§ã¯ãªããé·æãšçæã瀺ãããšã§ãã
ãµãŒããŒããŒãã®å®æãããã¢ãããžã§ã¯ããããã§èŠãããšãã§ããŸã ãå®éã«ããµãŒããŒã®äœæãå§ããŸãããã GraphQLèªäœã«é¢ããæ
å ±ãå«ãŸãªããã¬ãŒã ã¯ãŒã¯ãšç°å¢ã®æ§æãã¹ãããããã«ã¯ãããã«æ§é ã®äœæã«é²ã¿ãŸãïŒã¹ããã2ïŒã
ã¹ããã1. Yii2ã®ã€ã³ã¹ããŒã«ãšæ§æ
ãã®ã¹ãããã¯GraphQLãšã¯é¢ä¿ãããŸãããããããªãã¢ã¯ã·ã§ã³ã®ããã«å¿
èŠã§ãã
Yii2ãã€ã³ã¹ããŒã«ããŠæ§æããããã«æ®ããŸã ïŒå¿
é ïŒã
ãã¹ãŠå®äºããããå°ããªãã¶ãŒãäžããŸãããã ããŒã
$> yii migrate
...移è¡ã®å±¥æŽçšã«ããŒã¿ããŒã¹ã«ããŒãã«ãäœæãã...
$> yii migrate/create init
...移è¡ãã£ã¬ã¯ããªã«ç§»è¡çšã®æ°ãããã¡ã€ã«ãäœæããŸãïŒinitã¯ç§»è¡ã®ååã§ãä»»æã®ååã䜿çšã§ããŸãïŒã äœæãããã¡ã€ã«ã«ã次ã®ãœãŒã¹ã³ãŒããé
眮ããŸãã
<?php use yii\db\Migration; class m170828_175739_init extends Migration { public function safeUp() { $this->execute("CREATE TABLE IF NOT EXISTS `user` ( `id` INT NOT NULL, `firstname` VARCHAR(45) NULL, `lastname` VARCHAR(45) NULL, `createDate` DATETIME NULL, `modityDate` DATETIME NULL, `lastVisitDate` DATETIME NULL, `status` INT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB;"); $this->execute("CREATE TABLE IF NOT EXISTS `city` ( `id` INT NOT NULL, `name` VARCHAR(45) NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB;"); $this->execute("CREATE TABLE IF NOT EXISTS `address` ( `id` INT NOT NULL, `street` VARCHAR(45) NULL, `zip` VARCHAR(45) NULL, `createDate` DATETIME NULL, `modifyDate` DATETIME NULL, `status` INT NULL, `userId` INT NOT NULL, `cityId` INT NOT NULL, PRIMARY KEY (`id`), INDEX `fk_address_user_idx` (`userId` ASC), INDEX `fk_address_city1_idx` (`cityId` ASC), CONSTRAINT `fk_address_user` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_address_city1` FOREIGN KEY (`cityId`) REFERENCES `city` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB;"); } public function safeDown() { echo "m170828_175739_init cannot be reverted.\n"; return false; } }
...移è¡ãå®è¡ããŸãã
$> yii migrate
ã泚æ ç§èªèº«ã¯ããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠæäŸãããè³éããã€ãã¹ããŠããŒã¿ããŒã¹æ§é ãäœæããã®ã¯æªã圢ã§ãããšèããŠãããå®éã«ã¯ãããè¡ããŸããã ãã®äŸã§ã¯ãæéã®ç¯çŽã«ãªããŸããã åãããšããç§ãæ®ããsafeDownïŒïŒããŒã«ããã¯ã®ç¡èŠããã空ã®é¢æ°ã«ãåœãŠã¯ãŸããŸãã
ã泚æ ãã¹ãã«ã¯ãããŒã¿ããŒã¹ã«ããã€ãã®ãã¹ãããŒã¿ãå¿
èŠã§ãã èªåã§å
¥åãããã ãã¹ããªããžããªãã移è¡ããããšãã§ããŸã ã
äœæãããããŒã¿æ§é ã«åºã¥ããŠããã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããGiiãžã§ãã¬ãŒã¿ãŒã䜿çšããŠã¢ãã«ïŒActiveRecordïŒãçæããŸãã
$> yii gii/model --tableName=user --modelClass=User $> yii gii/model --tableName=city --modelClass=City $> yii gii/model --tableName=address --modelClass=Address
æåŸã«ããã¹ãŠã®éå±ãªä»äºã¯ç§ãã¡ã®åŸãã«ãããä»ããç§ãã¡ããã¹ãŠã®ããã«å§ãããã®ãããæã§ãã
ã¹ããã2. GraphQLã®æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ãã
ãã®ãããžã§ã¯ãã§ã¯ãåºæ¬çãªæ¡åŒµwebonyx / graphql-phpïŒhttps://github.com/webonyx/graphql-phpïŒã䜿çšããŸãã
$> composer require webonyx/graphql-php
ãŸããGitHubã§Yii2ã®æ¡åŒµãããæ¡åŒµæ©èœãèŠã€ããããšãã§ããŸãããäžèŠããã ãã§ã¯åºæ¿ãããŸããã§ããã 圌ãç¥ã£ãŠãããªããã³ã¡ã³ãã§ããªãã®çµéšãå
±æããŠãã ããã
ã¹ããã3.ãããžã§ã¯ãæ§é ãäœæããŸãã
GraphQLãµãŒããŒã®å®è£
ã«é¢äžããäž»ãªæ§é èŠçŽ ïŒ
ã¹ããŒã -GraphQLãµãŒããŒã®ãšã³ãã£ãã£ãæ ŒçŽãããã¬ãŒã ã¯ãŒã¯ã®ã«ãŒãã«ãããã£ã¬ã¯ããªïŒã¿ã€ããšçªç¶å€ç°ã ãã£ã¬ã¯ããªã®ååãšå Žæã¯éèŠã§ã¯ãããŸããã奜ããªååãä»ããŠå¥ã®åå空éã«é
眮ã§ããŸãïŒããšãã°ãapi /ãŸãã¯components /ïŒã
schema / QueryType.phpãschema / MutationType.php- ãã«ãŒããã¿ã€ãã
schema / Types.phpã¯ãã«ã¹ã¿ã ã¿ã€ããåæåããç¹å®ã®ã¢ã°ãªã²ãŒã¿ãŒã§ãã
ã¹ããŒã/ãã¥ãŒããŒã·ã§ã³ -ãã¥ãŒããŒã·ã§ã³ã¯ã䟿å®äžãå¥ã®ãã£ã¬ã¯ããªã«ä¿åããããšãæãŸããã
ããŠãå®éã«ã¯
controllers / api / GraphqlController.phpããšã³ããªãŒãã€ã³ãã§ãã GraphQLãµãŒããŒãžã®ãã¹ãŠã®èŠæ±ã¯ã1ã€ã®ãšã³ããªãã€ã³ã-/ api / graphqlãééããŸãã ãããã£ãŠãRESTful APIãåæã«ç¶æããããšã劚ãããã®ã¯äœããããŸããïŒãã®ç¹ã«é¢ããŠããããŸãã«èšãã°ãGraphQLãµãŒããŒã¯ãGraphQLã¯ãšãªããã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããAPIã¡ãœããã®1ã€ã§ãïŒã
ã¹ããã3.1 ã¢ãã«ã®ã¿ã€ããäœæããŸãã
æ°ããã¹ããŒããã£ã¬ã¯ããªãšãã®äžã®ã¢ãã«ã®ã¯ã©ã¹ãäœæããŸãã
/schema/CityType.phpïŒ <?php namespace app\schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; class CityType extends ObjectType { public function __construct() { $config = [ 'fields' => function() { return [ 'name' => [ 'type' => Type::string(), ], ]; } ]; parent::__construct($config); } }
ãã£ãŒã«ãã®èª¬æã«ã¯ã次ã®ãã©ã¡ãŒã¿ãŒãé¢äžããŸãã
type -GraphQLãã£ãŒã«ãã¿ã€ãïŒType :: stringïŒïŒãType :: intïŒïŒãªã©ïŒã
description-説æïŒããã¹ãã®ã¿ãã¹ããŒã ã§äœ¿çšãããããããªã¯ãšã¹ãã®ãããã°ã容æã«ãªããŸãïŒã
args-åãå
¥ããããåŒæ°ïŒé£æ³é
åãkeyã¯åŒæ°ã®ååãvalueã¯GraphQLã¿ã€ãïŒ
resolveïŒ$ rootã$ argsïŒã¯ããã£ãŒã«ãã®å€ãè¿ãé¢æ°ã§ãã åŒæ°ïŒ$ root-察å¿ããActiveRecordã®ãªããžã§ã¯ãïŒãã®å Žåãmodels \ Cityãªããžã§ã¯ããå
¥ã£ãŠããïŒ; $ argsã¯ãåŒæ°ã®é£æ³é
åã§ãïŒ$ argsã§èª¬æïŒã
ã¿ã€ããé€ããã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ã§ãã
/schema/UserType.phpïŒ <?php namespace app\schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use app\models\User; class UserType extends ObjectType { public function __construct() { $config = [ 'fields' => function() { return [ 'firstname' => [ 'type' => Type::string(), ], 'lastname' => [ 'type' => Type::string(), ], 'createDate' => [ 'type' => Type::string(),
/schema/AddressType.phpïŒ <?php namespace app\schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; class AddressType extends ObjectType { public function __construct() { $config = [ 'fields' => function() { return [ 'user' => [ 'type' => Types::user(), ], 'city' => [ 'type' => Types::city(), ],
AddressType.phpã®å Žåããã«ããŒã¯ã©ã¹Types.phpãå¿
èŠã§ããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
ã¹ããã3.2 ã¹ããŒã/ Types.php
å®éã®ãšãããGraphQLã¹ããŒãã«ã¯ãåãååã®è€æ°ã®åäžã¿ã€ããå«ããããšã¯ã§ããŸããã ããã¯ãTypes.phpã¢ã°ãªã²ãŒã¿ãŒãç£èŠããããã«èšèšããããã®ã§ãã ãã®ååã¯ãGraphQLã©ã€ãã©ãªã®æšæºã¯ã©ã¹ã§ããTypeãšã¯ç°ãªãããã«èŠããããã«ãTypesã«ãã£ãŠæå³çã«æ£ç¢ºã«éžæãããŠããŸãã ãããã£ãŠãType :: intïŒïŒãType :: stringïŒïŒãããã³ã«ã¹ã¿ã ã¿ã€ãTypes :: queryïŒïŒãTypes :: userïŒïŒãªã©ã䜿çšããŠæšæºã¿ã€ãã«ã¢ã¯ã»ã¹ã§ããŸãã
schema / Types.phpïŒ <?php namespace app\schema; use GraphQL\Type\Definition\ObjectType; class Types { private static $query; private static $mutation; private static $user; private static $address; private static $city; public static function query() { return self::$query ?: (self::$query = new QueryType()); } public static function user() { return self::$user ?: (self::$user = new UserType()); } public static function address() { return self::$address ?: (self::$address = new AddressType()); } public static function city() { return self::$city ?: (self::$city = new CityType()); } }
ã¹ããã3.3 ã¹ããŒã/ QueryType.php
<?php namespace app\schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use app\models\User; use app\models\Address; class QueryType extends ObjectType { public function __construct() { $config = [ 'fields' => function() { return [ 'user' => [ 'type' => Types::user(),
MutationType.phpã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
ã¹ããã3.4 ã³ã³ãããŒã©ãŒ/ api / GraphqlController.phpãäœæããŸã
ããã§æåŸã®ããŒããçµäºããŠãæ°ããäœæããã¿ã€ãã«å°éã§ããããã«ããŸãã
GraphqlController.phpïŒ <?php namespace app\controllers\api; use app\schema\Types; use GraphQL\GraphQL; use GraphQL\Schema; use yii\base\InvalidParamException; use yii\helpers\Json; class GraphqlController extends \yii\rest\ActiveController { public $modelClass = ''; protected function verbs() { return [ 'index' => ['POST'], ]; } public function actions() { return []; } public function actionIndex() {
ãŸããtry-catch GraphQLã§ã®ã©ããã³ã°ïŒãšã©ãŒåºåããã©ãŒãããããããã®executeïŒïŒã¯æ©èœããŸããã 圌ã¯ãã§ã«å
éšã§å¯èœãªãã¹ãŠãååããééããã©ããããã«ã€ããŠã¯ãå°ãåŸã§èª¬æããŸãã
ã¹ããã4.ãã¹ãã
å®éãç§ãã¡ãéæããããšãå®çŸããèŠãŠã觊ããŠã¿ãæãæ¥ãŸããã
Chome-GraphiQLã®æ¡åŒµæ©èœã§ã¯ãšãªã確èªããŸãããã å人çã«ã¯ãããé«åºŠãªæ©èœïŒã¯ãšãªã®ä¿åãã«ã¹ã¿ã ããããŒïŒãåããGraphiQL Feenã奜ã¿ãŸãã 確ãã«ãåŸè
ã«ã¯ãšã©ãŒåºåã«é¢ããåé¡ãããå ŽåããããŸãããããããµãŒããŒäžã§ãšã©ãŒãçºçããŠãäœã衚瀺ãããŸããã
ãã£ãŒã«ãã«å¿
èŠãªããŒã¿ãå
¥åããçµæã楜ããã§ãã ããïŒ

ãããã£ãŠãçµå±ã®ãšããã次ã®ããã«ãªããŸãã
- ãã£ãŒã«ããšåŒæ°ã«ãããªãŒãã³ã³ããªãŒãïŒç¡å¹ãªãã©ã¡ãŒã¿ãŒã«ã¯ãã¡ããäžç·ãä»ããŸãïŒ
- ãã€ã©ã€ãããããã£ãŒã«ãã®èª¬æãåºå
- å³åŽã®ãµãŒãã£ã³ã®èªåãã«ã
- ç¬æã®çµæ
ã泚æ çŸããURLãååŸããŠããªãå Žåã¯ãUrlManagerãš.htaccessãèšå®ããŠããªãããšãæå³ããŸãã å
ã®Yiiã§ã¯ãããã¯æ©èœããŸããã ãããè¡ãæ¹æ³ã«ã€ããŠã¯ãèšäºãªããžããªãã芧ãã ãã ããªãŒãã³ã³ããªãŒãåŒæ°ïŒ

å®å
šã«ã«ã¹ã¿ã åãããçµæãæã€å®å
šã«ã«ã¹ã¿ã åããããªã¯ãšã¹ãã¯ãããã³ããšã³ãéçºè
ã®å€¢ã§ãã

RESTfulãéçºããŠããéã«ãäœãããªãã£ããšããäºå®ã«ããããããããã¹ãŠã倢èŠãŠããããŸããïŒ ãã¡ããéããŸãã
ãŸããã¢ãã¬ã¹ãšãŠãŒã¶ãŒãåŒãåºãããã«ã2ã€ã®åå¥ã®èŠæ±ãè¡ãå¿
èŠã¯ãããŸããããããã«ãã¹ãŠãå®è¡ã§ããïŒå¿
èŠãªïŒãšããäºå®ã«æ³šæãæãããšãéèŠã§ãã

ç§ã¯å人çã«ãGraphQLã®éèŠãªå©ç¹ã®1ã€ãšããŠã¯ãšãªããããã°ã§ããããšãèæ
®ããŠããŸãã å®éã«ã¯ãæ¡åŒµæ©èœãåã蟌ãã¹ããŒã ãèªåçã«çæãããæ€èšŒãšãªãŒãã³ã³ããªãŒãããªã³ã«ãªããŸãã ãããã£ãŠãGraphQLãµãŒããŒãžã®ãšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ã®ã¿ãããã°ããã®æ©èœãå®å
šã«æ¢çŽ¢ã§ããŸãã ã»ãã¥ãªãã£ã§ã¯ãªãïŒ ç§ã«é¢ããŠã¯ãã»ãã¥ãªãã£ã¯ãããã«ç°ãªãã¬ãã«ã§å®è£
ãããŠããŸãã ä»»æã®APIã®ããã¥ã¡ã³ãã«ã¢ã¯ã»ã¹ã§ããã»ããå®å
šãªã¹ããŒã ãçšæãããŠããŸãã äžéšã®RESTful APIã«ã¯é¡äŒŒããJSONãŸãã¯XMLã¹ããŒãããããŸãããæ®å¿µãªããå€ãã¯ãããŸããããGraphQLã§ã¯æšæºã§ãããããã«ã¯ã©ã€ã¢ã³ãã«ãã£ãŠç©æ¥µçã«äœ¿çšãããŠããŸãã
ç¶ç¶ããã«ã¯...
èšäºã®æ¬¡ã®éšå
ã§ã¯ãUIã§ãã¹ãŠãçŸããæ¹æ³ã§äœ¿çšããæ¹æ³ã説æã
ãŸãããã¡ãããAPIãAPIã§ãªãå¥ã®ãããã¯ãã€ãŸã
çªç¶å€ç°ã§ãã