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.
laravel x モバイルアプリ
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
pochikawa

starfruits_j

Azione Co., Ltd.
Oshikawa
• 元Webデザイナ

• iOSアプリ開発

• たまにWebも触る

• PHP7は未経験

• SQLが嫌い
• 元Webデザイナ

• iOSアプリ開発

• たまにWebも触る

• PHP7は未経験

• SQLが嫌い
which.photos
ヤラナイカ
スプラトゥーンのフレンドの
オンライン状態をチェックし
たり通知してくれるアプリ
他 > littlegleam.com
発表内容
• アプリ開発者という生き物について
• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
アプリ開発者とはどんな生物? (所感です)
• ローカルでは主にSQLite

• アップデートの壁があるので、仕様変更はあまりしない(したく
ない)

• サーバサイドのように負荷分散等考えなくて良いので、あまり
チューニングとかしない(した...
つまりたまにしか

SQL書かない
忘れます!
SQL組み立てめんどい!
$sql = 'SELECT * FROM `laravel` WHERE ';
if ($user_id) {
$sql .= ' `user_id` = ' . $user_id;
} else {
$sql .=...
連想配列で組み立てるクエリビルダ
$arr = [];
if ($user_id) {
$arr['user_id'] = $user_id;
}
$db->select('table', $fields, $arr);
$arrってなんだっけ?
• resultがarrayだったり?

• 久々に触ると仕様を確認したりコードを呼んだ
りしなければならない

• SQL読んだ方が分かりやすい

• SQLが複雑になると、もはや読めもしない
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情
• モバイルアプリ用Web API 実装 tips
Realm
realm.io
RealmのModel
// Define your models like regular Swift classes
class Dog: Object {
dynamic var name = ""
dynamic var age = 0...
RealmのSelect
let tanDogs = realm.objects(Dog).filter("color = 'tan'")
let tanDogsWithBNames = tanDogs.filter("name BEGINSW...
よく使うクエリをclassメソッドで実装すると便利
class Dog: Object {
dynamic var name = ""
dynamic var age = 0
dynamic var color = "white"
class ...
モデルを書くことで仕様が決まり

モデルを見れば仕様が理解できる

コードが出来上がる👏
PHPでもメソッドチェインでクエリ
書けないものか?
そう、laravelならね
発表内容
• アプリ開発者という生き物について

• アプリ開発のDB事情

• モバイルアプリ用Web API 実装 tips
可視性の高い設計
• サーバ側とアプリ側でモデルを統一化したい

• Realmと酷似しているのでGood! 

• レコードを連想配列にしてJSON出力

• ModelのtoJson();でOK!レスポンスをJSONに
するのも簡単。

•...
users.password等、ユーザに渡せない情報
• Modelのhidden propertyで指定
アプリ側の実装
class User: Object {
dynamic var id = ""
dynamic var name = ""
}
https://realm.io/docs/swift/latest/#queries
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
* @property string $password // パスワード
*/
class...
deleted_at -> isDeleted
• カラムにないプロパティはget∼∼Attributeで追
加できる
アプリ側の実装
class User: Object {
dynamic var id = ""
dynamic var name = “"
dynamic var isDeleted = false
}
https://realm.io/do...
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
* @property string $deleted_at // 削除日時
*/
clas...
画像読み込みのストレスを減らす
• ローディング中に表示する
プレースホルダ用にサムネイ
ルをbase64したバイナリを
返す
laravel側の実装
/**
* @property string $id // ID
* @property string $name // 名前
*/
class User extends Model {
function getImag...
時差を考慮する
海外展開する場合等に困るので、
ISO8601で返すようにしてあげると安全
class User extends Model {
public function
getCreatedAtAttribute($date) {
re...
RESTfulは注意
• リクエストの回数が増える

• フリースポット等で予期せぬ200が返ります

• statusをjsonに含めてチェックする等してあげた
方が無難
エラー発生時
App::error(function(Exception $exception, $code)
use($self) {
Log::error($exception);
$res = array(
'status' => 0,
...
AfterFilter
$this->afterFilter(function($route, $request,
$response) use($self) {
$data = $response->getOriginalContent();...
レスポンスがタイムアウトするかも
• 通信状態が悪い場合、画像/動画のアップロード
でタイムアウトが発生するが、PHPはアップロー
ドが完了した時点でinsertしてしまう

• 極端に大きな通信はcommit用のAPIを用意して、
送信完了の...
ちょっとした変更でリクエストが複数回
• 通信量、速度のみでなく失敗のリスクも高まる

• JSON-RPC使う

• githubにあります (未確認)
laravelって素晴らしい!😉
• 優秀なQuery Builder

• 暗黙的でフレキシブルなORM

• SQLなんか書かなくて良い!

• 他FWに比べて並列分割のテーブルも扱いやすい

• API構築にも最適化されている
laravelって素晴らしい?😅
• CREATE TABLE必要

• Schema Builderもあるけど、やっぱり忘れる

• 複数テーブルをJOINし始めると辛い

• PHP7の新機能の活用に期待!
ご静聴ありがとう
ございました!
laravel x モバイルアプリ
Upcoming SlideShare
Loading in …5
×
Upcoming SlideShare
AzureでLaravel動かしてみた
Next
Download to read offline and view in fullscreen.

Share

laravel x モバイルアプリ

Download to read offline

モバイルアプリのAPIをlaravelで実装した時のTips等

Related Books

Free with a 30 day trial from Scribd

See all

laravel x モバイルアプリ

  1. 1. laravel x モバイルアプリ
  2. 2. 発表内容 • アプリ開発者という生き物について • アプリ開発のDB事情 • モバイルアプリ用Web API 実装 tips
  3. 3. pochikawa starfruits_j Azione Co., Ltd. Oshikawa
  4. 4. • 元Webデザイナ • iOSアプリ開発 • たまにWebも触る • PHP7は未経験 • SQLが嫌い
  5. 5. • 元Webデザイナ • iOSアプリ開発 • たまにWebも触る • PHP7は未経験 • SQLが嫌い
  6. 6. which.photos
  7. 7. ヤラナイカ スプラトゥーンのフレンドの オンライン状態をチェックし たり通知してくれるアプリ 他 > littlegleam.com
  8. 8. 発表内容 • アプリ開発者という生き物について • アプリ開発のDB事情 • モバイルアプリ用Web API 実装 tips
  9. 9. アプリ開発者とはどんな生物? (所感です) • ローカルでは主にSQLite • アップデートの壁があるので、仕様変更はあまりしない(したく ない) • サーバサイドのように負荷分散等考えなくて良いので、あまり チューニングとかしない(したくない) • Viewはアプリ側にあるので、たまにしかサーバサイドは触らな い • Swiftばっかり書いてると、Swift以外のコードは隠 したくなる
  10. 10. つまりたまにしか SQL書かない
  11. 11. 忘れます!
  12. 12. SQL組み立てめんどい! $sql = 'SELECT * FROM `laravel` WHERE '; if ($user_id) { $sql .= ' `user_id` = ' . $user_id; } else { $sql .= ' 1 = 1'; }
  13. 13. 連想配列で組み立てるクエリビルダ $arr = []; if ($user_id) { $arr['user_id'] = $user_id; } $db->select('table', $fields, $arr);
  14. 14. $arrってなんだっけ? • resultがarrayだったり? • 久々に触ると仕様を確認したりコードを呼んだ りしなければならない • SQL読んだ方が分かりやすい • SQLが複雑になると、もはや読めもしない
  15. 15. 発表内容 • アプリ開発者という生き物について • アプリ開発のDB事情 • モバイルアプリ用Web API 実装 tips
  16. 16. Realm realm.io
  17. 17. RealmのModel // Define your models like regular Swift classes class Dog: Object { dynamic var name = "" dynamic var age = 0 } // Use them like regular Swift objects let mydog = Dog() mydog.name = "Rex" print("name of dog: (mydog.name)") // Persist your data easily let realm = try! Realm() try! realm.write { realm.add(mydog) } https://realm.io/docs/swift/latest/
  18. 18. RealmのSelect let tanDogs = realm.objects(Dog).filter("color = 'tan'") let tanDogsWithBNames = tanDogs.filter("name BEGINSWITH ‘B'") ※メソッドチェインでクエリを組み立てられる https://realm.io/docs/swift/latest/#queries
  19. 19. よく使うクエリをclassメソッドで実装すると便利 class Dog: Object { dynamic var name = "" dynamic var age = 0 dynamic var color = "white" class func tanDogs() -> Results<Dog> { let realm = try! Realm() return realm.objects(Dog).filter("color = 'tan'") } } Dog.tanDogs().sorted("age", ascending: false) https://realm.io/docs/swift/latest/#queries
  20. 20. モデルを書くことで仕様が決まり モデルを見れば仕様が理解できる コードが出来上がる👏
  21. 21. PHPでもメソッドチェインでクエリ 書けないものか?
  22. 22. そう、laravelならね
  23. 23. 発表内容 • アプリ開発者という生き物について • アプリ開発のDB事情 • モバイルアプリ用Web API 実装 tips
  24. 24. 可視性の高い設計 • サーバ側とアプリ側でモデルを統一化したい • Realmと酷似しているのでGood! • レコードを連想配列にしてJSON出力 • ModelのtoJson();でOK!レスポンスをJSONに するのも簡単。 • アプリ側はRealmにマッピングして保存
  25. 25. users.password等、ユーザに渡せない情報 • Modelのhidden propertyで指定
  26. 26. アプリ側の実装 class User: Object { dynamic var id = "" dynamic var name = "" } https://realm.io/docs/swift/latest/#queries
  27. 27. laravel側の実装 /** * @property string $id // ID * @property string $name // 名前 * @property string $password // パスワード */ class User extends Model { protected $hidden = ['password']; } https://realm.io/docs/swift/latest/#queries
  28. 28. deleted_at -> isDeleted • カラムにないプロパティはget∼∼Attributeで追 加できる
  29. 29. アプリ側の実装 class User: Object { dynamic var id = "" dynamic var name = “" dynamic var isDeleted = false } https://realm.io/docs/swift/latest/#queries
  30. 30. laravel側の実装 /** * @property string $id // ID * @property string $name // 名前 * @property string $deleted_at // 削除日時 */ class User extends Model { protected $hidden = [‘deleted_at’]; function getIsDeletedAttribute() { return (boolean) ($this->deleted_at); } } https://realm.io/docs/swift/latest/#queries
  31. 31. 画像読み込みのストレスを減らす • ローディング中に表示する プレースホルダ用にサムネイ ルをbase64したバイナリを 返す
  32. 32. laravel側の実装 /** * @property string $id // ID * @property string $name // 名前 */ class User extends Model { function getImageURLAttribute() { return sprintf('%s/images/%d.jpg', Config::get('app.url'), $this->user_id); } function getThumbnailAttribute() { $bin = file_get_contents( $this->thumbnail_file_path); return base64encode($bin); } } https://realm.io/docs/swift/latest/#queries
  33. 33. 時差を考慮する 海外展開する場合等に困るので、 ISO8601で返すようにしてあげると安全 class User extends Model { public function getCreatedAtAttribute($date) { return date('c', strtotime($date)); } public function getUpdatedAtAttribute($date) { return date('c', strtotime($date)); } } https://realm.io/docs/swift/latest/#queries
  34. 34. RESTfulは注意 • リクエストの回数が増える • フリースポット等で予期せぬ200が返ります • statusをjsonに含めてチェックする等してあげた 方が無難
  35. 35. エラー発生時 App::error(function(Exception $exception, $code) use($self) { Log::error($exception); $res = array( 'status' => 0, 'code' => $code, 'message' => $exception->getMessage(), 'trace' => $exception->getTraceAsString(), ); if ($self->isDebug()) { $res['sql_history'] = $self->sql_history; $res['post'] = $_POST; $res['get'] = $_GET; } return Response::json($res, $code); }); https://realm.io/docs/swift/latest/#queries
  36. 36. AfterFilter $this->afterFilter(function($route, $request, $response) use($self) { $data = $response->getOriginalContent(); if (!$data) { $data = array(); } if (is_array($data)) { if (!isset($data['status'])) { $data['status'] = 1; } if ($self->isDebug()) { $data['sql_history'] = $self->sql_history; $data['post'] = $_POST; $data['get'] = $_GET; } $response->setContent($data); } }); https://realm.io/docs/swift/latest/#queries
  37. 37. レスポンスがタイムアウトするかも • 通信状態が悪い場合、画像/動画のアップロード でタイムアウトが発生するが、PHPはアップロー ドが完了した時点でinsertしてしまう • 極端に大きな通信はcommit用のAPIを用意して、 送信完了のレスポンスを受け取ってからcommit する
  38. 38. ちょっとした変更でリクエストが複数回 • 通信量、速度のみでなく失敗のリスクも高まる • JSON-RPC使う • githubにあります (未確認)
  39. 39. laravelって素晴らしい!😉 • 優秀なQuery Builder • 暗黙的でフレキシブルなORM • SQLなんか書かなくて良い! • 他FWに比べて並列分割のテーブルも扱いやすい • API構築にも最適化されている
  40. 40. laravelって素晴らしい?😅 • CREATE TABLE必要 • Schema Builderもあるけど、やっぱり忘れる • 複数テーブルをJOINし始めると辛い • PHP7の新機能の活用に期待!
  41. 41. ご静聴ありがとう ございました!
  • ssuserd4dd90

    Sep. 18, 2021
  • kunihara

    Aug. 8, 2016
  • yuichitakada88

    Apr. 6, 2016

モバイルアプリのAPIをlaravelで実装した時のTips等

Views

Total views

3,240

On Slideshare

0

From embeds

0

Number of embeds

717

Actions

Downloads

8

Shares

0

Comments

0

Likes

3

×