Yiiãã¬ãŒã ã¯ãŒã¯ã«RESTFul APIãå®è£
ããããã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã¯å€æ°ãããŸããããããã®ãœãªã¥ãŒã·ã§ã³ãå®éã®ãããžã§ã¯ãã§äœ¿çšããå Žåããã¹ãŠãç¬ãšãã®ææè
ã®äŸã§ã®ã¿çŸããèŠããããšãçè§£ããŠããŸãã
ãããããèšäºã®æºåããã³å·çäžã«ãRESTful APIãäœæããããã®çµã¿èŸŒã¿ãã¬ãŒã ã¯ãŒã¯ãåããYii2ã®ãªãªãŒã¹ãšã®é¢é£æ§ããããã«å€±ãããŸããã ãããããã®èšäºã¯ãYii2ã«ãŸã æ
£ããŠããªã人ããæ¢åã®ã¢ããªã±ãŒã·ã§ã³çšã®æ¬æ ŒçãªAPIãè¿
éãã€ç°¡åã«å®è£
ããå¿
èŠããã人ã«ãšã£ãŠã¯äŸç¶ãšããŠæçšã§ãã
ãŸããæ¢åã®æ¡åŒµæ©èœã䜿çšããéã«ãµãŒããŒAPIãå®å
šã«æäœããå¿
èŠããªãã£ãããã€ãã®æ©èœã®ãªã¹ãã瀺ããŸãã
- æåã«ééããåé¡ã®1ã€ã¯ã1ã€ã®ããŒãã«ã«ããŸããŸãªãšã³ãã£ãã£ãæ ŒçŽããããšã§ããã ãã®ãããªã¬ã³ãŒããååŸããã«ã¯ãããšãã°ããã«ç€ºãããã«ãã¢ãã«åãåã«ç€ºãã ãã§ã¯äžååã§ã ã ãã®ãããªã¡ã«ããºã ã®1ã€ã®äŸã¯ãRBACã¡ã«ããºã ã®ãã¬ãŒã ã¯ãŒã¯ã§äœ¿çšããã
AuthItems
ããŒãã«ã§ãïŒèª°ããããã«æ
£ããŠããªãå Žåããã®ãããã¯ã«é¢ãããã°ãããèšäºããããŸãïŒã type
ãã©ã°ã«ãã£ãŠæ±ºå®ãããããŒã«ãæäœãããã³ã¿ã¹ã¯ãå«ãŸããŠãããç°ãªãURLã䜿çšãããAPIãä»ããŠãããã®ãšã³ãã£ãã£ãæäœããŸãã
GET: /api/authitems/?type=0 -
GET: /api/authitems/?type=1 -
GET: /api/authitems/?type=2 -
ãããããã®ãããªïŒ
GET: /api/operations -
GET: /api/tasks -
GET: /api/roles -
åæããŠã2çªç®ã®ãªãã·ã§ã³ã¯ãç¹ã«ãã¬ãŒã ã¯ãŒã¯ãšãã®äžã®RBACããã€ã¹ã«ç²ŸéããŠããªã人ã«ãšã£ãŠãããæçœã§çè§£ããããããã«èŠããŸãã
- 2çªç®ã®éèŠãªæ©äŒã¯ãæ¡ä»¶ãèšå®ããã«ãŒã«ãçµåããæ©èœãåããããŒã¿æ€çŽ¢ããã³ãã£ã«ã¿ãªã³ã°ã¡ã«ããºã ã§ãã ããšãã°ãç§ã¯ãã®ãããªãªã¯ãšã¹ãã®é¡äŒŒç©ãå®è¡ã§ããããã«ãããã£ãïŒ
SELECT * FROM users WHERE (age>25 AND first_name LIKE '%alex%') OR (last_name='shepard');
- ã³ã¬ã¯ã·ã§ã³ãäœæãæŽæ°ãåé€ããã ãã§ã¯äžååãªå ŽåããããŸãã ã€ãŸã å床æ€çŽ¢ãšãã£ã«ã¿ãªã³ã°ã䜿çšããŠã1ã€ã®ã¯ãšãªã§nçªç®ã®ã¬ã³ãŒãæ°ã倿ŽããŸãã ããšãã°ãããããæ¡ä»¶ã«è©²åœãããã¹ãŠã®ã¬ã³ãŒããé »ç¹ã«åé€ãŸãã¯æŽæ°ããå¿
èŠããããåã
ã®ã¯ãšãªã䜿çšããã«ã¯è²»çšãããããããŸãã
- ãã1ã€ã®éèŠãªãã€ã³ãã¯ãé¢é£ããŒã¿ãåä¿¡ã§ããããšã§ãã ããšãã°ããããã®åœ¹å²ãšãã®ãã¹ãŠã®ã¿ã¹ã¯ãšæäœãååŸããŸãã
- ãã¡ãããåä¿¡ããã¬ã³ãŒãã®æ°ãå¶éããïŒ
limit
ïŒãéžæã®éå§ãã·ããããïŒ offset
ïŒãã¬ã³ãŒãã®ãœãŒãé ãæå®ããïŒ order by
ïŒããšãã§ããªããšãå°ãªããšãäœããã®åœ¢ã§APIãæäœããããšã¯ã§ããŸããã ãŸããã°ã«ãŒãåïŒ group by
ïŒã§ãããšäŸ¿å©ã§ãã
- åæäœã®ãŠãŒã¶ãŒæš©éã確èªã§ããããšãéèŠã§ãïŒ
checkAccess
ã¡ãœããcheckAccess
ãŸã åãRBACã«ãããŸãïŒã
- ãããŠæåŸã«ãå
šäœãäœããã®åœ¢ã§ãã¹ãããå¿
èŠããããŸãã
ã»ãŒãã®ãããªããŠã£ãã·ã¥ãªã¹ããã®ãªã¹ããåæããçµæããã®ãã°ããããã¬ãŒã ã¯ãŒã¯ã§ã®APIå®è£
ã®ç§ã®ããŒãžã§ã³ãçãŸããŸããïŒ
ãŸããAPIãã¯ã©ã€ã¢ã³ããæ¢ãæ¹æ³ã
åãRBACã³ã³ããŒãã³ãã®äŸãèŠãŠã¿ãŸãããã
ã¬ã³ãŒããååŸãã
ãã¹ãŠããã€ãéãã§ãïŒ
GET: /roles -
GET: /roles/42 - id=42
æ€çŽ¢ãšãã£ã«ã¿ãŒ
ãããã®ã¡ã«ããºã ã¯ã»ãŒåãã§ãããå¯äžã®éãã¯ãæ€çŽ¢æãéšåçã«äžèŽããã¬ã³ãŒããéžæã«å«ãŸããå Žåãšãå®å
šã«ãã£ã«ã¿ãªã³ã°ãããå Žåã§ãã ãã£ãŒã«ããšãã®å€ã®çµã¿åããã¯ãJSON圢åŒã§æå®ãããŸãã ãã®æ©èœãå®è£
ããã®ã«æã䟿å©ã ãšæãããã®ã¯åœŒã§ããã äŸïŒ
{"name":"alex", "age":"25"}
-次ã®åœ¢åŒã®ã¯ãšãªã«äžèŽããŸãïŒ
WHERE name='alex' AND age=25
[{"name":"alex"}, {"age":"25"}]
-次ã®åœ¢åŒã®ã¯ãšãªã«äžèŽïŒ
WHERE name='alex' OR age=25
ã€ãŸã 1ã€ã®ãªããžã§ã¯ãã«æž¡ããããã©ã¡ãŒã¿ãŒã¯ANDæ¡ä»¶ã«å¯Ÿå¿ãããªããžã§ã¯ãã®é
åã§æå®ããããã©ã¡ãŒã¿ãŒã¯ORæ¡ä»¶ã«å¯Ÿå¿ããŸãã
ANDããã³
ORæ¡ä»¶ã«å ããŠãå€ã®åã«å¿
èŠãªæ¬¡ã®æ¡ä»¶ãæå®ã§ããŸãã
<:
ç§>:
ãã£ãš<=:
ããå°ãããçãã>=:
以äž<>:
çãããªã=:
çãã
ããã€ãã®äŸïŒ
GET: /users?filter={"name":"alex"}
- alex
ãšããååã®ãŠãŒã¶ãŒ
GET: /users?filter={"name":"alex", "age":">25"}
- alex
ãšããååã®ãŠãŒã¶ãŒ25
æ³ä»¥äž
GET: /users?filter=[{"name":"alex"}, {"name":"dmitry"}]
-ååãalex
ãŸãã¯dmitry
ãŠãŒã¶ãŒ
GET: /users?search={"name":"alex"}
-ãµãã¹ããªã³ã°alex
ïŒalexeyãalexanderãalexãªã©ïŒãå«ãååãæã€ãŠãŒã¶ãŒ
é¢é£ããŒã¿ãæäœãã
å€ãã®å Žåãé¢é£ããŒã¿ãæäœããããã®æ¬¡ã®æ§æãèŠã€ããããšãã§ããŸãã
GET: /roles/42/operations
- id = 42
ããŒã«ã«å±ãããã¹ãŠã®æäœãååŸããŸã
æåã¯ãã®ç¹å®ã®ã¢ãããŒãã䜿çšããŸãããããã®éçšã§ããã€ãã®æ¬ ç¹ãããããšã«æ°ä»ããŸããã
1察å€
é¢ä¿ã1察å€ã®å Žåãäžèšã®ãã£ã«ã¿ãŒã¢ãããŒãã䜿çšã§ããŸãã
GET: operations?filter={"role_id":"42"}
- id = 42
ããŒã«ã«å±ãããã¹ãŠã®æäœãååŸããŸã
å€å¯Ÿå€
å€ãã®å Žåãéä¿¡ããŒãã«ã¯ãã£ãŒã«ã
parent_id
ããã³
child_id
éå®ãããªããããéä¿¡ã®æäœã¯å€ãã®å Žåãåå¥ã®ãšã³ãã£ãã£ãšããŠã¯ããã«äŸ¿å©ã§ãã 補åïŒ
products
ïŒãšãã®ç¹æ§ïŒ
features
ïŒã®äŸãèããŠã¿ãŸãããã éä¿¡ããŒãã«ã«ã¯ãå°ãªããšã2ã€ã®ãã£ãŒã«ã
product_id
ããã³
feature_id
ã§ãã ãã ãã補åã«ãŒãã®ç¹æ§ãªã¹ãã®ãœãŒãé ãèšå®ããå¿
èŠãããå Žåã¯ã
ordering
ãã£ãŒã«ããããŒãã«ã«è¿œå ããå¿
èŠã
value
ãåãç¹æ§ã®å€ã®
value
ã远å ããå¿
èŠããããŸãã
ãã©ãŒã ã®URLã䜿çšïŒ
POST: /products/42/feature/1
補å42
ã補åç¹æ§1
é¢é£ä»ããŸã
GET: /products/42/feature/1
補å1
ã®ç¹æ§ãååŸããŸãïŒ features
衚ããå
¥åïŒ
åããœãŒãé ãšç¹æ§å€ïŒéä¿¡ããŒãã«ããã®å
¥åïŒãååŸããæ¹æ³ã¯ãããŸããã å人çãªçµéšããããã®ãããªçš®é¡ã®é¢ä¿ã§ã¯ã
productfeatures
ãªã©ã®å¥ã®ãšã³ãã£ãã£ã䜿çšããæ¹ããããšç¢ºä¿¡ããŸããã
ãããã£ãŠã次ã®ããã«ãªããŸãã
POST: /productfeatures
èŠæ±ã®æ¬æã«product_id
ã feature_id
ã ordering
ãããã³value
ã®ãã©ã¡ãŒã¿ãŒãæž¡ããšãå€ãšãœãŒãé ã瀺ãç¹æ§ãšè£œåããªã³ã¯ãããŸãã
GET: /productfeatures?filter={"product_id":"42"}
-ç¹æ§ãæã€è£œåã®ãã¹ãŠã®ãªã³ã¯ãååŸããŸãã çãã¯æ¬¡ã®ããã«ãªããŸãã
[ {"id":"12","feature_id":"1","product_id":"42","value":"33"}, {"id":"13","feature_id":"2","product_id":"42","value":"54"} ]
PUT: /productfeatures/12
- id=12
ãªã³ã¯ã倿ŽããŸã
ãã¡ããããã®ã¢ãããŒãã«ãæ¬ é¥ããªãããã§ã¯ãããŸãããããšãã°ã2åã®è¿œå ãªã¯ãšã¹ããªãã§ã¯è£œååãšç¹æ§åãååŸã§ããªãããã§ãã ããã§ãé¢é£ããŒã¿ãååŸããã¡ã«ããºã ã圹ç«ã¡ãŸãã
é¢é£ããŒã¿ã®ååŸ
GET: /productfeatures/12?with=product,feature
補åãšç¹æ§ãšãšãã«æ¥ç¶ãååŸããŸãã ãµãŒããŒå¿çã®äŸïŒ
{ "id":"12", "feature_id":"1", "product_id":"42", "value":"33", "feature":{"id":"1","name":"","unit":""}, "product":{"id":"42","name":"", ...}, }
åæ§ã«ãååã®ãã¹ãŠã®ç¹æ§ãååŸã§ããŸãã
GET: /products/42?with=features
- id=42
補åããŒã¿ãšé
åå
ã®ãã¹ãŠã®ç¹æ§ãåãåããŸãã ãµãŒããŒå¿çã®äŸïŒ
{ "id":"42", "name":"", "features":[{"id":"1","name":"","unit":""}, {"id":"2","name":"","unit":""}], ... }
ä»åŸã¯ã
with
ã䜿çšãã
with
ãé¢é£ããããŒãã«ããããŒã¿ãååŸã§ããã ãã§ãªããå€ãæã€é
åãç°¡åã«èšè¿°ã§ãããšèšããŸãã ããã¯ãããšãã°ãã¹ããŒã¿ã¹ã®å¯èœãªå€ã®ãªã¹ãã補åããŒã¿ãšãšãã«éä¿¡ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãã 補åã®ã¹ããŒã¿ã¹ã¯
status
ãã£ãŒã«ãã«ä¿åãã
status
ããåä¿¡ãã
status:0
å€ã¯ããŸãããããŸããã ãããè¡ãã«ã¯ã補åããŒã¿ãšäžç·ã«ããã®èª¬æã§å¯èœãªã¹ããŒã¿ã¹ãååŸã§ããŸãã
{ ..., "status":1, "statuses":{0:" ", 1:" ", 2:" "}, ..., }
ããŒã¿åé€
DELETE: /role/42 - id=42
DELETE: /role -
åé€ãããšãã¯ãæ€çŽ¢ãšãã£ã«ã¿ãªã³ã°ã䜿çšã§ããŸãã
DELETE: /role?filter={"name":"admin"} - "admin"
ããŒã¿äœæ
POST: /role -
åäžã®ãªã¯ãšã¹ãã§ãããšãã°æ¬¡ã®åœ¢åŒã®ãªã¯ãšã¹ãæ¬æã®ããŒã¿ã®é
åã転éããããšã«ãããåäžã®ã¬ã³ãŒããšã³ã¬ã¯ã·ã§ã³ã®äž¡æ¹ãäœæã§ããŸãã
[ {"name":"admin"}, {"name":"guest"} ]
ãã®ããã«ããŠã察å¿ããååãæã€2ã€ã®ããŒã«ãäœæãããŸãã ãã®å Žåã®ãµãŒããŒå¿çããäœæãããã¬ã³ãŒãã®é
åã«ãªããŸãã
ããŒã¿å€æŽ
äœæãšåæ§ã«ãURLã§idãã©ã¡ãŒã¿ãŒãæå®ããå¿
èŠãããã®ã¯ãã¡ãããPUTã ãã§ãïŒ
PUT: /role/42 - 42
è€æ°ã®ãšã³ããªã倿ŽããŸãã
PUT: /role
ãªã¯ãšã¹ãããã£ãæž¡ã
[ {"id":"1","name":"admin"}, {"id":"2","name":"guest"} ]
ID 1ããã³2ã®ãšã³ããªã倿ŽãããŸãã
ãã£ã«ã¿ãŒã§èŠã€ãã£ãã¬ã³ãŒãã倿ŽããŸãã
PUT: /user?filter={"role":"guest"}' - role=guest
ã¬ã³ãŒãã®å¶éããªãã»ãããé åº
éšåãµã³ããªã³ã°ã§ã¯ãéåžžã®
limit
ãš
offset
ãŸãã
offset
ãŒãããå§ãŸããªãã»ãã
limit
-ãšã³ããªæ°
order
-ãœãŒãé
GET: /users/?offset=10&limit=10
GET: /users/?order=id DESC
GET: /users/?order=id ASC
以äžãçµã¿åãããããšãã§ããŸãã
GET: /users/?order=parent_id ASC,ordering ASC
å¿çã«å¶éãšãªãã»ãããã©ã®ããã«è¡šç€ºããããã«ã€ããŠèšåããããšãéèŠã§ãã ããšãã°ãå¿çæ¬æã§ããŒã¿ãéä¿¡ãããªã©ãããã€ãã®ãªãã·ã§ã³ãæ€èšããŸããã
{ data:[ {id:1, name:"Alex", role:"admin"}, {id:2, name:"Dmitry", role:"guest"} ], meta:{ total:2, offset:0, limit:10 } }
ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãAngularJSã䜿çšããŸããã ç§ã«ã¯ã
$resource
ã¡ã«ããºã ãå®è£
ãããšéåžžã«äŸ¿å©ã«æããŸããã ãã®æ©èœã«ã€ããŠã¯è©³ãã説æããŸããããå®éã«äœ¿çšããã«ã¯ãäžå¿
èŠãªæ
å ±ãªãã§ã¯ãªãŒã³ãªããŒã¿ãååŸããæ¹ãè¯ããšããäºå®ã§ãã ãããã£ãŠãéžæããã¬ã³ãŒãã®æ°ã«é¢ããããŒã¿ã¯ããããŒã«ç§»åãããŸããã
GET: roles?limit=5
Content-Range:items 0-4/10 - 0 4, 10.
äžèšã®èŠåºãã¯ã4ã€ã®ã¬ã³ãŒããåä¿¡ãããã®ã§ã¯ãªãã5ïŒãŒãããŒã¹ïŒãåä¿¡ãããããšã瀺ããŠããããšã«æ³šæããããšãéèŠã§ãã ã€ãŸã 10åãã¹ãŠã®ãšã³ããªãåãåããšãã¿ã€ãã«ã¯æ¬¡ã®åœ¢åŒã«ãªããŸãã
Content-Range:items 0-9/10 - 0 9 10.
ã¯ã©ã€ã¢ã³ãã§ãã®ãããªããããŒãè§£æããããšã¯é£ãããããŸããããŸããå¿çæ¬æã«ãäœåãªãããŒã¿ãè©°ãŸãããšã¯ãããŸããã
ãµãŒããŒã§ã®å®è£
ã
æåã®ã¹ãããã¯ãã¢ãžã¥ãŒã«ãäœæããããšã§ãã ãã¡ãããããã¯å¿
é ã®èŠä»¶ã§ã¯ãããŸããããã¢ãžã¥ãŒã«ã¯ããã«æé©ã§ãã ã¢ãžã¥ãŒã«åã«APIããŒãžã§ã³ãå«ããããšãã§ããŸãã
次ã«ãã¢ããªã±ãŒã·ã§ã³ã®æ§æã§ãURLãšãªã¯ãšã¹ãã¡ãœããã«åŸã£ãŠé©åãªã«ãŒãã£ã³ã°ã®ããã®ããã€ãã®ã«ãŒã«ã远å ããŸãã
array('api/<controller>/list', 'pattern'=>'api/<controller:\w+>', 'verb'=>'GET'), array('api/<controller>/view', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'GET'), array('api/<controller>/create', 'pattern'=>'api/<controller:\w+>', 'verb'=>'POST'), array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'PUT'), array('api/<controller>/update', 'pattern'=>'api/<controller:\w+>', 'verb'=>'PUT'), array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>/<id:\d+>', 'verb'=>'DELETE'), array('api/<controller>/delete', 'pattern'=>'api/<controller:\w+>', 'verb'=>'DELETE'),
ãã¬ãŒã ã¯ãŒã¯ã«å°ãªããšãããçšåºŠç²ŸéããŠãã人ã«ãšã£ãŠã¯ã説æããããšã¯äœããªããšæããŸãã
次ã«ã
ApiController.php
ã
Controller.php
ããã³
ApiRelationProvider.php
䟿å©ãªæ¹æ³ã§æ¥ç¶ã
ApiRelationProvider.php
ã
APIã¢ãžã¥ãŒã«ã³ã³ãããŒã©ãŒ
ãã¹ãŠã®APIã¢ãžã¥ãŒã«ã³ã³ãããŒã©ãŒã¯ã
ApiController
ã¯ã©ã¹ãæ¡åŒµããå¿
èŠããããŸãã
ã«ãŒã¿ãŒã®èšå®ãããæ¬¡ã®ã¡ãœããïŒ
actions
ïŒãã³ã³ãããŒã©ãŒã«å®è£
ããå¿
èŠãããããšã¯æããã§ãã
actionView()
-ã¬ã³ãŒããååŸãã
actionList()
-ã¬ã³ãŒãã®ãªã¹ããååŸãã
actionCreate()
-ã¬ã³ãŒããäœæããŸã
actionUpdate()
-ã¬ã³ãŒãã®å€æŽ
actionDelete()
-ã¬ã³ãŒããåé€ãã
ãŠãŒã¶ãŒããŒã«ã³ã³ãããŒã©ãŒã®äŸãèããŠã¿ãŸãããã åè¿°ããããã«ãRBACãã¬ãŒã ã¯ãŒã¯ã¡ã«ããºã ã¯ããã¹ãŠã®ãšã³ãã£ãã£ïŒããŒã«ãæäœãã¿ã¹ã¯ïŒã1ã€ã®ããŒãã«ïŒ
authitem
ïŒã«
authitem
ãŸãã ãšã³ãã£ãã£ã®ã¿ã€ãã¯ããã®ããŒãã«ã®
type
ãã©ã°ã«ãã£ãŠæ±ºå®ãããŸãã ã€ãŸã
RolesController
ã
OperationsController
ã
TasksController
ã¯ã1ã€ã®ã¢ãã«ïŒ
AuthItems
ïŒã§åäœããå¿
èŠããããŸããããããã®ã¹ã³ãŒãã¯ã察å¿ãã
type
å€ãæã€ã¬ã³ãŒãã®ã¿ã«å¶éããå¿
èŠããããŸãã
ã³ã³ãããŒã©ãŒã³ãŒãïŒ class RolesController extends ApiController { public function __construct($id, $module = null) { $this->model = new AuthItem('read'); $this->baseCriteria = new CDbCriteria(); $this->baseCriteria->addCondition('type='.AuthItem::ROLE_TYPE); parent::__construct($id, $module); } public function actionView(){ if(!Yii::app()->user->checkAccess('getRole')){ $this->accessDenied(); } $this->getView(); } public function actionList(){ if(!Yii::app()->user->checkAccess('getRole')){ $this->accessDenied(); } $this->getList(); } public function actionCreate(){ if(!Yii::app()->user->checkAccess('createRole')){ $this->accessDenied(); } $this->model->setScenario('create'); $this->priorityData = array('type'=>AuthItem::ROLE_TYPE); $this->create(); } public function actionUpdate( ){ if(!Yii::app()->user->checkAccess('updateRole')){ $this->accessDenied(); } $this->model->setScenario('update'); $this->priorityData = array('type'=>AuthItem::ROLE_TYPE); $this->update(); } public function actionDelete( ){ if(!Yii::app()->user->checkAccess('deleteRole')){ $this->accessDenied(); } $this->model->setScenario('delete'); $this->delete(); } public function getRelations() { return array( 'roleoperations'=>array( 'relationName'=>'operations', 'columnName'=>'operations', 'return'=>'array' ) ); } }
ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒã¡ãœããã§ãã³ã³ãããŒã©ãŒãåäœããã¢ãã«ãæå®ããã¢ãã«ã®ã€ã³ã¹ã¿ã³ã¹ãã³ã³ãããŒã©ãŒã®
model
ããããã£ã«å²ãåœãŠãŸãã
baseCriteria
ããããã£ãæå®ãããã®æ¡ä»¶ïŒ
addCondition('type='.AuthItem::ROLE_TYPE)
ïŒãå²ãåœãŠãããš
baseCriteria
ãã¯ã©ã€ã¢ã³ãããåä¿¡ãããã¹ãŠã®ããŒã¿ã«ã€ããŠããã®æ¡ä»¶ãæºããå¿
èŠããããšå€æããŸãã ãããã£ãŠãããŒã¿ãåä¿¡ãæŽæ°ãåé€ããããã®ã¬ã³ãŒããéžæããå Žåãæ¡ä»¶
type=2
äžèŽããã¬ã³ãŒã
type=2
ç®çã®
id
å€ãæã€ã¬ã³ãŒããããŒãã«ã«ååšãããã
type
ã
baseCriteria
æå®ããããã®ãšç°ãªãå Žå
baseCriteria
ã¯ã©ã€ã¢ã³ãã¯404ãšã©ãŒãåãåããŸãã
actionCreate()
ã¡ãœããã¯ã
priorityData
ããããã£ã®å€
actionCreate()
èšå®ããŸãããã®ããããã£ã¯ãã¯ã©ã€ã¢ã³ããããªã¯ãšã¹ãæ¬æã§åä¿¡ããããŒã¿ããªãŒããŒã©ã€ãããããŒã¿ã»ãããæå®ããŸãã ã€ãŸããã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ãæ¬æã®
type
ããããã£ã42ãšããŠæå®ããå Žåã§ãã
AuthItem::ROLE_TYPE
ïŒ2ïŒã®å€ã«åå®çŸ©ãããããŒã«ä»¥å€ã®ãšã³ãã£ãã£ã®äœæã¯èš±å¯ãããŸããã
æäœãå®è¡ããåã«ã
checkAccess()
ã¡ãœããã䜿çšããŠãŠãŒã¶ãŒæš©éããã§ãã¯ãããã¢ãã«ã«å¿ããŠã·ããªãªã瀺ãããŸããããã¯ãæ€èšŒã«ãŒã«ãŸãã¯ããªã¬ãŒãã·ããªãªã«å¿ããŠã¢ãã«ããžãã¯ã§å®çŸ©ã§ããããã§ãã
ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¡ãœããïŒ
getView()
ã
getList()
ã
create()
ã
update()
ã
delete()
ïŒã¯ãããã©ã«ãã§ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããã¢ããªã±ãŒã·ã§ã³ãçµäºããŸãã æåã®ãã©ã¡ãŒã¿ãŒ
false
ãåãåã£ãã¡ãœããã¯ãå¿çãé
åãšããŠè¿ããŸãã ããã¯ããŠãŒã¶ãŒã«éä¿¡ããåã«ã¢ãã«ããåä¿¡ããããŒã¿ã®äžéšã®å±æ§ïŒãã¹ã¯ãŒããªã©ïŒãã¯ãªã¢ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãã ãã®å Žåãå¿çã³ãŒãã¯
statusCode
ããããã£ããååŸã§ããŸãããã®ããããã£ã¯ãã¡ãœããã®å®è¡åŸã«å
¥åãããŸãã
æåŸã®ã³ã³ãããŒã©ãŒã¡ãœãã
getRelations()
ã¯ãã¢ãã«ã®é¢ä¿ãæ§æããããã«äœ¿çšãããŸãã ãã®ã¡ãœããã¯ãé¢ä¿ã®ã»ãããèšè¿°ããé
åãè¿ãå¿
èŠããããŸãã ãã®å Žåã
...?with=roleoperations
ãã©ã¡ãŒã¿ãŒãURLã§æå®ãããšãããŒã«ããŒã¿ãšãšãã«ãããã«å²ãåœãŠããããã¹ãŠã®æäœãåãåããŸãã
{ bizrule: null description: "Administrator" id: "1" name: "admin" operations: [{...}, {...},...] type: "2" }
getRelations()
ã¡ãœããã«ãã£ãŠè¿ãããé
åã§ã¯ãé
åããŒã¯GETãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ãããªã³ã¯ã®ååã§ãïŒãã®å Žåã
roleoperations
ïŒã
æ¥ç¶ãæ§æããé
åã®èŠçŽ ã®å€ïŒ
relationName
| string
| ã¢ãã«å
ã®ãªã³ã¯ã®ååã ã¢ãã«ã«ããããã®æ¥ç¶ããªãå Žåã ãã¬ãŒã ã¯ãŒã¯ã¡ã«ããºã ã¯ããã®ååã®ããããã£ãååŸãããã get ã«çœ®ãæããŠã¡ãœãããå®è¡ããããšããŸãã ããšãã°ãã¢ãã«ã¡ãœããã¯æ¥ç¶ãšããŠãæ©èœããŸãããã®ãããæ¥ç¶ã®åågetPossibleValues() possibleValues ãªã©getPossibleValues() ãæå®ããããŒã¿ã®é
åãè¿ãã¢ãã«ã§getPossibleValues() ã¡ãœãããäœæããgetPossibleValues() ãããŸãã
|
columnName
| string
| èŠã€ãã£ãã¬ã³ãŒãããµãŒããŒå¿çã«è¿œå ããã屿§ã®ååã
|
return
| string ('array' | 'object')
| ãªããžã§ã¯ãã®é
åïŒã¢ãã«ïŒãŸãã¯å€ã®é
åãè¿ããŸãã
|
ã»ãšãã©ã®å Žåãã³ã³ãããŒã©ãŒã¯äžèšãããã¯ããã«ã·ã³ãã«ã«èŠãããšèšããªããã°ãªããŸããã ç§ã®ãããžã§ã¯ãã®1ã€ã®ã³ã³ãããŒã©ãŒã®äŸã次ã«ç€ºããŸãã
<?php class TagController extends ApiController { public function __construct($id, $module = null) { $this->model = new Tag('read'); parent::__construct($id, $module); } public function actionView(){ $this->getView(); } public function actionList(){ $this->getList(); } public function actionCreate(){ if(!Yii::app()->user->checkAccess('createTag')){ $this->accessDenied(); } $this->create(); } public function actionUpdate(){ if(!Yii::app()->user->checkAccess('updateTag')){ $this->accessDenied(); } $this->update(); } public function actionDelete(){ if(!Yii::app()->user->checkAccess('deleteTag')){ $this->accessDenied(); } $this->delete(); } }
ApiController
ã¯ã©ã¹ã®ç°¡åãªèª¬æïŒ
ããããã£ïŒç©ä»¶
| çš®é¡
| 説æ
|
---|
data
| é
å
| ãªã¯ãšã¹ãæ¬æããã®ããŒã¿ã Content-Type: x-www-form-urlencoded ã䜿çšãã Content-Type: application/json ã䜿çšãããªã¯ãšã¹ãããã®ããŒã¿ã¯ãé
åã«å
¥ããŸã
|
priorityData
| é
å
| ããŒã¿ã®äœæããã³å€æŽæäœãå®è¡ãããšãã«ãèŠæ±æ¬æããã®ããŒã¿ïŒããŒã¿ïŒã§çœ®æãŸãã¯è£è¶³ãããããŒã¿ã
|
model
| CActiveRecord
| ããŒã¿ãæäœããããã®ã¢ãã«ã€ã³ã¹ã¿ã³ã¹ã
|
statusCode
| æŽæ°
| ãµãŒããŒå¿çã³ãŒãã åæå€ã¯200 ã§ãã
|
criteriaParams
| é
å
| åæéžæãã©ã¡ãŒã¿ãŒïŒ limit ã offset ã order ïŒã GETèŠæ±ãã©ã¡ãŒã¿ãŒããååŸããå€ã¯ãé
åå
ã®å¯Ÿå¿ããå€ããªãŒããŒã©ã€ãããŸãã å
ã®å€ïŒ
array( 'limit' => 100, 'offset' => 0, 'order' => 'id ASC' )
|
contentRange
| é
å
| éžæããã¬ã³ãŒãã®æ°ã«é¢ããããŒã¿ã äŸïŒ
array( 'total'=>10, 'start'=>6, 'end'=>15 )
|
sendToEndUser
| ããŒã«å€
| æäœã®å®äºïŒè¡šç€ºãäœæã倿Žãåé€ïŒåŸã«ããŒã¿ããŠãŒã¶ãŒã«éä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
criteria
| CDbCriteria
| ããŒã¿ãååŸããããã®CDbCriteria ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã èŠæ±ããã®ããŒã¿ïŒå¶éããªãã»ãããé åºããã£ã«ã¿ãŒãæ€çŽ¢ãªã©ïŒã«åºã¥ããŠæ§æãããŸã
|
baseCriteria
| CDbCriteria
| ããŒã¿ãååŸããããã®CDbCriteria ã¯ã©ã¹ã®åºæ¬ã€ã³ã¹ã¿ã³ã¹ã ãªããžã§ã¯ãæ¡ä»¶ã¯criteria æ¡ä»¶ãããåªå
ããcriteria ã
|
notFoundErrorResponse
| é
å
| ãšã³ããªãèŠã€ãããªãå Žåã®ãµãŒããŒã®å¿çã
|
æ¹æ³- getViewïŒïŒ
GETãã©ã¡ãŒã¿ãŒã«åŸã£ãŠã¬ã³ãŒããæ€çŽ¢ããŸãã æžã蟌ã¿ãã©ã¡ãŒã¿ãŒã®é
åãè¿ããããŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããŸãã ã¬ã³ãŒããèŠã€ãããªãå Žåã404ã®å¿çã³ãŒããå«ããšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã«éä¿¡ãããã察å¿ãããšã©ãŒæ
å ±ãå«ãé
åãè¿ããŸãã ãªã¯ãšã¹ãã®å®è¡åŸã«statusCode
ããããã£ãé©åãªå€ã«èšå®ããŸãã
getView(boolean $sendToEndUser = true, integer $id)
|
$ sendToEndUser
| ããŒã«å€
| æäœãå®äºããåŸã«ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
$ id
| æŽæ°
| ãšã³ããªã®idãã©ã¡ãŒã¿ã æž¡ãããªãå ŽåãGETãã©ã¡ãŒã¿ãŒããåã蟌ãŸããŸãã
|
- getListïŒïŒ
GETãã©ã¡ãŒã¿ãŒã«åŸã£ãŠã¬ã³ãŒããæ€çŽ¢ããŸãã èŠã€ãã£ãã¬ã³ãŒãã®é
åãŸãã¯ç©ºã®é
åãè¿ããŸãã
getList(boolean $sendToEndUser = true)
|
$ sendToEndUser
| ããŒã«å€
| æäœãå®äºããåŸã«ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
- äœæïŒïŒ
èŠæ±æ¬æããååŸããããŒã¿ã䜿çšããŠãæ°ããã¬ã³ãŒããäœæããŸãã 屿§ã®é
åããªã¯ãšã¹ãããã£ã§éä¿¡ãããå Žåã察å¿ããã¬ã³ãŒãæ°ãèªèãããŸãã æ°ããã¬ã³ãŒãã®å±æ§ãå«ãé
åãè¿ããŸãã
äŸïŒ
array( 'name'=>'Alex', 'age'=>'25' )
array( array( 'name'=>'Alex', 'age'=>'25' ), array( 'name'=>'Dmitry', 'age'=>'33' ) )
create(boolean $sendToEndUser = true)
|
$ sendToEndUser
| ããŒã«å€
| æäœãå®äºããåŸã«ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
- æŽæ°ïŒïŒ
åä¿¡ããGETãã©ã¡ãŒã¿ãŒã«åŸã£ãŠèŠã€ãã£ãã¬ã³ãŒããæŽæ°ããŸãã æžã蟌ã¿ãã©ã¡ãŒã¿ãŒã®é
åãè¿ããããŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããŸãã ã¬ã³ãŒããèŠã€ãããªãå Žåã404ã®å¿çã³ãŒããå«ããšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã«éä¿¡ãããã察å¿ãããšã©ãŒæ
å ±ãå«ãé
åãè¿ããŸãã ã¬ã³ãŒãã®é
åããªã¯ãšã¹ãããã£ã§è»¢éãããå Žåã察å¿ããã¬ã³ãŒãæ°ã倿Žããããããã®å€ãæã€é
åãè¿ãããŸãã
äŸïŒ
PUT: users/1
array( 'name'=>'Alex', 'age'=>'25' )
PUT: users
array( array( 'id'=>1, 'name'=>'Alex', 'age'=>'25' ), array( 'id'=>2, 'name'=>'Dmitry', 'age'=>'33' ) )
update(boolean $sendToEndUser = true, integer $id)
|
$ sendToEndUser
| ããŒã«å€
| æäœãå®äºããåŸã«ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
$ id
| æŽæ°
| ãšã³ããªã®idãã©ã¡ãŒã¿ã æž¡ãããªãå ŽåãGETãã©ã¡ãŒã¿ãŒããåã蟌ãŸããŸãã
|
- åé€ïŒïŒ
åä¿¡ããGETãã©ã¡ãŒã¿ãŒã«åŸã£ãŠèŠã€ãã£ãã¬ã³ãŒããåé€ããŸãã ãªã¢ãŒãã¬ã³ãŒããã©ã¡ãŒã¿ãŒã®é
åãè¿ããããŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããŸãã ã¬ã³ãŒããèŠã€ãããªãå Žåãå¿çã³ãŒã404ã®ãšã©ãŒã¡ãã»ãŒãžããŠãŒã¶ãŒã«éä¿¡ãããã察å¿ãããšã©ãŒæ
å ±ãå«ãé
åãè¿ããŸãã idãã©ã¡ãŒã¿ãŒãåä¿¡ãããªãå Žåããã¹ãŠã®ã¬ã³ãŒããåé€ãããŸãã
delete(boolean $sendToEndUser = true, integer $id)
|
$ sendToEndUser
| ããŒã«å€
| æäœãå®äºããåŸã«ãŠãŒã¶ãŒã«ããŒã¿ãéä¿¡ããããã¢ã¯ã·ã§ã³ã®çµæãé
åã®åœ¢åŒã§è¿ããã
|
$ id
| æŽæ°
| ãšã³ããªã®idãã©ã¡ãŒã¿ã æž¡ãããªãå ŽåãGETãã©ã¡ãŒã¿ãŒããåã蟌ãŸããŸãã
|
ãã¹ãäž
APIã®ãã¹ãã®åé¡ã調æ»ããŠãå€ãã®ã¢ãããŒããæ€èšããŸããã åäœãã¹ãã§ã¯ãªãæ©èœãã¹ãã䜿çšããããšããå§ãããŸãã ããããã»ã¬ã³ã䜿çšããŠãã©ãŒã ãäœæããå
¥åãã£ãŒã«ãã远å ããããŒã¿ãå
¥åããéä¿¡ãã¿ã³ãã¯ãªãã¯ããŠãµãŒããŒã®å¿çãåæããŠéä¿¡ãããªã©ã®ä¿¡ããããªãæ¹æ³ã§ãæ©èœãã¹ãã®ããã€ãã®æ¹æ³ã詊ããŸããïŒ
Seleniumããã³
PhantomJsã䜿çšïŒãã®æ¹æ³ã§ã¯ãã¹ãã«äœå¹ŽãããããŸãïŒ
æ€çŽ¢ãããã«æ·±ãæãäžããä»ã®éçºè
ã®çµéšãåæããŠãcurlã䜿çšããŠAPIããã¹ãããããã®ã¯ã©ã¹ãäœæããŸãããããã䜿çšããã«ã¯ãã¯ã©ã¹ApiTestCase
ãæ¥ç¶ãããããããã¹ãã¯ã©ã¹ãæ¡åŒµããå¿
èŠããããŸããAPIã®ãã¹ãäžã«æåã«ééããåé¡ã¯ãã¢ã¯ã»ã¹èš±å¯ã®åé¡ã§ããããã¹ãäžã«ããã¹ãããŒã¹ã䜿çšãããŸãããããã£ãŠãRBACã䜿çšããããŒãã«ã«åžžã«ææ°ã®ããŒã¿ãããããšãåžžã«ç£èŠããå¿
èŠããããŸããããã§ãªãå Žåããšã³ãã£ãã£ã®äœæããã¹ãããããšãã{"error":{"access":"You do not have sufficient permissions to access."}}
ãšãã³ãŒã403ã§å¿çãååŸã§ããŸãã APIã³ã³ãããŒã©ãŒã®ã¢ã¯ã·ã§ã³ã§ããã®åé¡ã解決ããããã«ãã³ã³ããŒãã³ããæ©èœããããã®äœæ¥ããŒã¹ã䜿çšããããšã«ããŸãããauthManager
ããã¹ãç°å¢ã®æ§æãã¡ã€ã«ïŒconfig / test.phpïŒã§ä»¥äžãæå®ããããšã«ãããã¢ã¯ã»ã¹æš©ãåŠçããŸãã ... 'proddb'=>array( 'class'=>'CDbConnection', 'connectionString' => 'mysql:host=localhost;dbname=yiirestmodel', 'emulatePrepare' => true, 'username' => '', 'password' => '', 'charset' => 'utf8', ),
ãã®ã¢ãããŒãã®å¯äžã®å¶éã¯ããŠãŒã¶ãŒç®¡çè
ããã¹ãããŒã¹id=1
ã§äœæ¥ç®¡çè
ããŒã«ã«å²ãåœãŠãããŠããå Žåid=42
ãã³ã³ããŒãã³ãã¯ãã®ãããªãŠãŒã¶ãŒã管çè
ãšèŠãªããªãããããŠãŒã¶ãŒããŒãã«ã®èš±å¯ãŠãŒã¶ãŒã®idå€ãäž¡æ¹ã®ããŒã¿ããŒã¹ã§åãã§ããããšã確èªããå¿
èŠãããããšã§ãïŒãã¹ãäŸïŒ class UsersControllerTest extends ApiTestCase { public $fixtures = array( 'users'=>'User' ); public function testActionView(){ $user = $this->users('admin'); $response = $this->get('api/users/'.$user->id, array(), array('cookies'=>$this->getAuthCookies())); $this->assertEquals($response['code'], 200); $this->assertNotNull($response['decoded']); $this->assertEquals($response['decoded']['id'], $user->id); $this->assertArrayNotHasKey('password', $response['decoded']); $this->assertArrayNotHasKey('guid', $response['decoded']); } public function testActionList(){ $response = $this->get('api/users', array(), array('cookies'=>$this->getAuthCookies())); $this->assertEquals($response['code'], 200); $this->assertEquals(count($response['decoded']), User::model()->count()); } public function testActionCreate(){ $response = $this->post( 'api/users', array( 'first_name' => 'new_first_name', 'middle_name' => 'new_middle_name', 'last_name' => 'new_last_name', 'password' => 'new_user_psw', 'password_repeat' => 'new_user_psw', 'role' => 'guest', ), array('cookies'=>$this->getAuthCookies()) ); $this->assertEquals($response['code'], 200); $this->assertNotNull($response['decoded']); $this->assertArrayHasKey('id', $response['decoded']); $this->assertArrayNotHasKey('password', $response['decoded']); $this->assertNotNull( User::model()->findByPk($response['decoded']['id']) ); } }
æåã«ããã¹ãã§äœ¿çšããããã£ã¯ã¹ãã£ã瀺ããŸããæ¬¡ã«ããã¹ãã¡ãœããã§ãã¡ãœããã䜿çšããŠãªã¯ãšã¹ããäœæãApiTestCase::get()
ïŒGETã¡ãœããã䜿çšããŠãªã¯ãšã¹ããå®è¡ïŒãURLãæž¡ããã¡ãœãããåŒã³åºããŠåä¿¡ããæ¿èªCookieãæž¡ãApiTestCase::getAuthCookies()
ãŸãããããã®CookieãååŸããã«ã¯ããã©ã¡ãŒã¿ãŒ$loginUrl
ãšãæå®ããå¿
èŠããããŸã$loginData
ãApiTestCase
ãã¹ãã®åã¯ã©ã¹ã§ããããç»é²ããªãããã«ãã¯ã©ã¹ã§ããããçŽæ¥æå®ããŸãïŒ public $loginUrl = 'api/login'; public $loginData = array('login'=>'admin', 'password'=>'admin');
ãã®ã¡ãœããApiTestCase::getAuthCookies()
ã¯ãåŒã³åºãããšã«èªèšŒèŠæ±ãè¡ãã®ã§ã¯ãªãããã£ãã·ã¥ãããããŒã¿ãè¿ãã®ã«ååã¹ããŒãã§ãããšèšããªããã°ãªããŸãããèŠæ±ãåå®è¡ããã«ã¯ãæåã®ãã©ã¡ãŒã¿ãŒãæž¡ãããšãã§ããŸãtrue
ãæ¹æ³ApiTestCase :: GETïŒïŒïŒãšããŠApiTestCase::post()
ãApiTestCase::put()
ãApiTestCase::delete()
ïŒæ¬¡ã®æ§é ã䜿çšããŠã¯ãšãªãå®è¡ããããŒã¿ã®é
åãè¿ããŸããbody
| ã²ã
| ãµãŒããŒå¿ç
|
code
| æŽæ°
| å¿çã³ãŒã
|
cookies
| é
å
| å¿çã§åä¿¡ããCookieã®é
å
|
headers
| é
å
| å¿çã§åä¿¡ããããããŒã®é
åïŒããããŒå=>ããããŒå€ïŒäŸïŒ
array( 'Date' => "Fri, 23 May 2014 12:10:37 GMT" 'Server' =>"Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.9" ... )
|
decoded
| é
å
| ãã³ãŒããããïŒjson_decodeïŒãµãŒããŒå¿çã®é
å
|
ãã®ããŒã¿ã¯ããµãŒããŒå¿çã®å®å
šãªãã¹ããšåæã«ååã§ããèŠæ±ãžã®å¿çãåä¿¡ããåŸãããŸããŸãªã¢ãµãŒãããã§ãã¯ãããŸãããããã¯éåžžã«æçœã§ãããã³ã¡ã³ããå¿
èŠãšããŸããããã¡ãããããã¯ãšã³ãã£ãã£ã®å®å
šãªãã¹ãã³ãŒããšã¯ã»ã©é ãã§ããããã®äŸã¯ã¯ã©ã¹ã§ã®äœæ¥ã®ååãçè§£ããã®ã«ååApiTestCase
ã§ããçãã¯ã©ã¹ã®èª¬æApiTestCase
ïŒããããã£ïŒç©ä»¶
| çš®é¡
| 説æ
|
---|
authCookies
| é
å
| èªèšŒåŸã«åä¿¡ããCookieïŒã¡ãœããåŒã³åºãApiTestCase::getAuthCookies() ïŒ
|
loginUrl
| ã²ã
| èªèšŒCookieãåä¿¡ããããã®èªèšŒãªã¯ãšã¹ããå®äºããããã®ã¢ãã¬ã¹ã
|
loginData
| é
åïŒïŒ
| . :
array('login'=>'admin', 'password'=>'admin');
|
:- getAuthCookies()
.
getAuthCookies(boolean $reload = false)
|
$reload
| boolean
| .
|
- get()
GET. .
get( string $url, array $params = array(), array $options = array()){
|
$url
| string
| Url
|
$params
| array
| GET
|
$options
| array
| , curl_setopt_array . cookies , (=>) .
|
- post()
POST. .
post( string $url, array $params = array(), array $options = array()){
|
$url
| string
| Url
|
$params
| array
| ãªã¯ãšã¹ãããã£ã§æž¡ããããªã¯ãšã¹ããã©ã¡ãŒã¿ã®é
å
|
$ãªãã·ã§ã³
| é
å
| ã¡ãœããã«çœ®æããããªãã·ã§ã³ãèŠæ±ããŸãcurl_setopt_array ããŸããé
åã«ã¯cookies ããªã¯ãšã¹ãããããŒã§éä¿¡ããããã«ãå€ãCookieã®é
åïŒåå=>å€ïŒã§ããå¿
èŠãããèŠçŽ ãããå ŽåããããŸãã
|
- putïŒïŒ
PUTã¡ãœããã䜿çšããŠãªã¯ãšã¹ããå®è¡ããŸãããµãŒããŒå¿çãã©ã¡ãŒã¿ãŒãå«ãé
åãè¿ããŸãã
ãã©ã¡ãŒã¿ã®èª¬æã¯ãApiTestCase :: postïŒïŒãåç
§ããŠãã ãã
- deleteïŒïŒ
DELETEã¡ãœããã䜿çšããŠã¯ãšãªãå®è¡ããŸãããµãŒããŒå¿çãã©ã¡ãŒã¿ãŒãå«ãé
åãè¿ããŸãã
ãã©ã¡ãŒã¿ãŒã®èª¬æã¯ãApiTestCase :: postïŒïŒãåç
§ããŠãã ãã
githubãžã®ãªã³ã¯ããããã«
ãã¡ãããããŒã¿ãåŠçããããã«äœ¿çšããããããè² è·ãé«ããšåé¡ãçºçããå¯èœæ§ããããŸãActiveRecord
ãããã¯ãã£ãã·ã³ã°ã«ãã£ãŠéšåçã«è§£æ±ºã§ãããšæããŸãïŒYiiã«ã¯ããã«å¿
èŠãªãã®ããã¹ãŠæã£ãŠããããïŒãæ¡åŒµæ©èœå
šäœã§ã¯ãªããŠã圹ã«ç«ã€ãšæãéçºè
ãããããšãé¡ã£ãŠããŸãããã®å Žåãäžéšã®æ¡åŒµæ©èœãã¢ã€ãã¢ã ãã䜿çšãããŸããå°æ¥ã®èšç»ã¯ããå€ãã®ããŸããŸãªæ¹åãšå€æŽã§ãããããã³ã¡ã³ããææ¡ã«æè¬ããŸããPS
èšäºã¯å€§ããïŒæå³ããããã®ã®ååã説æããããšã¯ã§ããŸããã§ãããïŒããããåŒãè£ããããããšã倿ããŸãããæ
å ±ãå°æ¥åœ¹ã«ç«ã€å Žåã¯ãããã«ããã€ãã®ãã€ã³ãã説æããããšæããŸããããšãã°ãæ¿èªã®å®è£
æ¹æ³ãã³ã¬ã¯ã·ã§ã³ã®åä¿¡æ¹æ³ïŒãªã¯ãšã¹ãã1ã€ã«ãŸãšããïŒãªã©ããŸããAngularJSããŒã«ã䜿çšããŠã¯ã©ã€ã¢ã³ãåŽAPIãšå¯Ÿè©±ããæ¹æ³ãããã³æ€çŽ¢ãšã³ãžã³ã«åªããåäžããŒãžã¢ããªã±ãŒã·ã§ã³ïŒPhantomJsã«ããããŒãžã¬ã³ããªã³ã°ã䜿çšïŒãäœæããæ¹æ³ã«ã€ããŠã話ããããšæããŸãã