Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CakePHP3で学ぶAPIマネジメント #phpconfuk

3,967 views

Published on

PHPカンファレンス福岡2016での登壇資料です!

Published in: Technology
  • Be the first to comment

CakePHP3で学ぶAPIマネジメント #phpconfuk

  1. 1. CakePHP3で学ぶ APIマネジメント 2016/05/21 PHPカンファレンス福岡 松村 優大
  2. 2. 自己紹介 • 松村 優大(MLBお兄さん) • 島根出身の28歳 • 株式会社オルターブース • テクニカルアーキテクト 2
  3. 3. 会社紹介 福岡発 フルスタックサービス開発 つまらない世界からお客様を解放させ、 もっと刺激のある世界へ変化させよう! 3
  4. 4. よく使うWebフレームワーク 4
  5. 5. 5 Controller Model View
  6. 6. 6 • データ(≒テーブル)の管理 • ビジネスロジック Model • ユーザインターフェースを表現 • Controllerからデータが渡る View • ModelからViewへ出力データを渡す • ViewからModelへ入力データ渡す Controller
  7. 7. Viewはツラいです・・・ • デバッグが難しい、または出来ない • 実行時エラー(=例外)が発生して初めて バグに気付く • ControllerからViewへのデータ連携が ネック • CakePHP ... viewVars • ASP.NET ... ViewBag, ViewData 7
  8. 8. 8 コ「userName とい う変数に氏名を設定 しといたからな!」 ビ「userName とい う変数にある氏名を 表示するで!」 コ「氏名を設定する 変数を staffName に 変更したで!」 修正 ビ「userName って 変数が無くなっとる やんけ!」⇒例外 密結合
  9. 9. 9
  10. 10. 10
  11. 11. 11 実装済みの機能に修正を加える場合もあ るし、製造時と修正時の担当者が異なる場 合も多々ある。 データの受渡し方にルールを設けるべき だという考えも分かるが、そもそもこのよう なデータの受渡し方を行うことにリスクがあ るのではないか。 もっと品質を高められる仕組みはないか。 テツヤシタクナイ。
  12. 12. 12 Controller Model HTML JavaScript
  13. 13. 13 Viewを使わず データはAPIで提供
  14. 14. 2015年10月~ APIぽいもの API設計の基礎不足を痛感 ダサいエンドポイント /api/getUserName とか…。 v3.0 14
  15. 15. 2016年01月~ 猛勉強ターン 15 v3.1
  16. 16. 2016年03月~ RESTAPI & SPA APIデザインを勉強し、規 模の大きな開発で実践中 16 v3.2
  17. 17. APIの品質を高める仕組み 1. 開発者/利用者にとって易しいAPI設計 2. フレームワーク機能の適切な利用 3. プルリクエストによるコードレビュー 4. エンドポイント単位の単体テスト 17
  18. 18. 設計:リクエスト • HTTPメソッド • 認証方式 • パラメータ • GET : クエリパラメータ • POST/PUT : JSON • 型、必須かどうかも明記 18
  19. 19. 設計:レスポンス • 正常系レスポンス項目 • GET : ページング情報も付加 • JSONレスポンスの例を明記 • 異常系レスポンス項目 • エラー情報とステータスコードを明記 • JSONレスポンスの例を明記 19
  20. 20. 設計:詳細設計 • API内部での処理を記載 • リクエスト情報、レスポンス情報では 伝わりにくい部分を明記 20
  21. 21. 設計:単体テスト • API設計時にテストケースも考える • リクエストパラメータのパターンテスト • 取得件数やソートに関するパターンが 意外と漏れる • 単体テストはPHPUnitを使用 • ステータスコードのチェック • レスポンスJSONの想定と実際の比較 21
  22. 22. 22 Input/Outputを明確にする APIの挙動のイメージが容易 フロントエンドで APIが利用しやすくなる
  23. 23. 23 本編では弊社の API設計書フォーマット をお見せしました
  24. 24. CakePHP3を採用したワケ • CakePHP2での開発経験 #NOT実務レベル • こだわりはほとんど無い • MVCフレームワークであること • O/Rマッパー機能をもつこと • せっかくだから最新のCakePHP3を採用 24
  25. 25. 25 バージョンが一つあがった だけっしょwww
  26. 26. 26 バージョンが一つあがった だけっしょwww Entity Table
  27. 27. Model Entity • レコード • 列=プロパティ • バリデーション Table • DBテーブルを操作 • find(er) • TableRegistry 27 http://book.cakephp.org/3.0/ja/orm.html http://qiita.com/kozo/items/87dc9f725e71dd742468 http://qiita.com/morisuke/items/e466d2ab360ab5646e9a
  28. 28. CakePHP3でAPIを作る手順 1. ルーティングの設定 2. ビューの準備 3. CRUDメソッドの定義 http://book.cakephp.org/3.0/ja/development/rest.html 28
  29. 29. 1. ルーティングのスコープ切り分け ※よくみる /api/ のあれ 2. 拡張子の指定( json, xml, etc ) 3. RESTアクセスしたいリソースを指定 ※リソース=Model http://book.cakephp.org/3.0/ja/development/routing.html#restful ルーティングの設定 29
  30. 30. ビューの準備 1. JSON形式のレスポンスには CakeViewJsonView が使用される 2. JsonViewのマルチバイト対応 3. AppController->beforeRender にて マルチバイト対応JsonViewを適用 http://blog.doizaki.com/entry/2015/05/19/050106 30
  31. 31. $ curl http://localhost/api/users.json { "users": [ { "id": 1, "name": "u3086u3046u305f" } ] } 31
  32. 32. CRUDメソッドの定義 1. スキャフォールドのCRUDメソッドでも APIとして動作する 2. レスポンスデータを連想配列化 32 HTTPメソッド エンドポイント メソッド GET /users Index() GET /users/:id view($id) POST /users add() PUT /users/:id edit($id) DELETE /users/:id delete($id)
  33. 33. 課題 • 認証 • HTTPヘッダの適切利用 • RESTのネスト構成 • /company/:id/employee/:id みたいな • CakePHPプラグイン 33
  34. 34. ありがとうございました。

×