ルーティングを使ってシンプルなアプリケーション開発を

24
ルルルルルルルルルル ルルルルルルルルルルルルルルルル ルルルルルルル ルルルルル <[email protected]>

Upload: kousuke-ebihara

Post on 15-Jan-2015

3.600 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: ルーティングを使ってシンプルなアプリケーション開発を

ルーティングを使ってシンプルなアプリケーション開発を

株式会社手嶋屋 海老原昂輔<[email protected]>

Page 2: ルーティングを使ってシンプルなアプリケーション開発を

Who am I?

海老原昂輔 (Kousuke Ebihara) 21 歳 17 歳(高校 2 年)の冬より有限会社手嶋

屋(当時)にアルバイトとして勤務し、 OpenPNE と出会う

私立日本大学芸術学部演劇学科を中退、 2008 年 10 月に株式会社手嶋屋に入社し、今に至る

Page 3: ルーティングを使ってシンプルなアプリケーション開発を

OSS 活動 OpenPNE3 Platform の生みの親 OpenPNE2, OpenPNE3 の lead

developer (OpenPNE3) opCommunityTopicPlugin の

臨時 lead developer 関連する OSS プロジェクトへのパッチ提供

symfony Doctrine PHP Shindig Chiara_PEAR_Server

Page 4: ルーティングを使ってシンプルなアプリケーション開発を

それでは本題 今日はみなさんに symfony のルーティ

ングの素晴らしさを訴えかける人として来ました ただし OpenPNE3 では全然使いこなしてい

ないところも残ってるけど……>< 基本的には symfony 1.2 を前提に解説

します

Page 5: ルーティングを使ってシンプルなアプリケーション開発を

ところでみなさん、こんなアクションを書いてませんか?

Page 6: ルーティングを使ってシンプルなアプリケーション開発を

ところでみなさん、こんなアクションを書いてませんか?

Page 7: ルーティングを使ってシンプルなアプリケーション開発を

ところでみなさん、こんなアクションを書いてませんか?

Page 8: ルーティングを使ってシンプルなアプリケーション開発を

みなさんのアクションは統一が取れてますか?

member モジュールのメンバー追加用アクションは create なのに、 diary モジュールだと対応するアクションが insert になっている

member モジュールと diary モジュールの表示用アクション show は同じパラメータを取るにもかかわらずバリデーションルールが統一されていない

Page 9: ルーティングを使ってシンプルなアプリケーション開発を

ルーティングをうまく使うと 特定のリクエストパラメータからデータベー

スのレコードを取得する処理や、レコードの存在チェックをアクション側でおこなわなくて済む

リクエストパラメータに関するバリデーションをアクション側でおこなわなくて済む

リクエストメソッドのチェックをアクション側でおこなわなくて済む

アクション名やバリデーション処理を共通化しやすくなる

Page 10: ルーティングを使ってシンプルなアプリケーション開発を

レコード取得をアクション側でおこなわないようにする

apps/frontend/config/routing.yml でルーティングルールの設定をおこなう ルール処理用のクラスとして sfObjectRoute

を使うよう設定 ここでは Doctrine に特化した

sfDoctrineRoute という sfObjectRoute の派生クラスを例に取ります

対象となるモデルの設定等もおこなう

Page 11: ルーティングを使ってシンプルなアプリケーション開発を

レコード取得をアクション側でおこなわないようにする

こんな感じの設定になるはず

Page 12: ルーティングを使ってシンプルなアプリケーション開発を

レコード取得をアクション側でおこなわないようにする

アクション側で簡単アクセス

これすら面倒であれば preExecute() に書いたってよい アクション毎のパラメータの違いとかモデル

の違いとかは全部ルーティング側で吸収してくれているので扱いやすいはず

Page 13: ルーティングを使ってシンプルなアプリケーション開発を

レコード取得をアクション側でおこなわないようにする

いろんなリクエストパラメータを組み合わせてレコードを取得したい場合 指定したモデルに実在するフィールド名と同

じ名前のリクエストパラメータを指定した場合、そのパラメータの値でレコードが絞り込まれるe.g. /member/birthday/1988-04-23

ただし別モデルへの問い合わせが必要になるなど、場合によっては sfObjectRoute クラスの派生クラスの作成が必要になる

Page 14: ルーティングを使ってシンプルなアプリケーション開発を

レコードの存在チェックをアクション側でおこなわないようにする

実はもうできています sfObjectRoute は、デフォルトではレコー

ドが取得できなかった場合に sfError404Exception をスローします

Page 15: ルーティングを使ってシンプルなアプリケーション開発を

レコードの存在チェックをアクション側でおこなわないようにする ということは最初の show アクションは

こうすることも可能ですね!

Page 16: ルーティングを使ってシンプルなアプリケーション開発を

レコードの存在チェックをおこなわないようにする

レコードが取得できなくてもよい場合は以下のように設定すれば OK

Page 17: ルーティングを使ってシンプルなアプリケーション開発を

リクエストパラメータのバリデーションをアクション側でおこなわないようにする

簡単なバリデーションなら正規表現を使って設定に書ける

Page 18: ルーティングを使ってシンプルなアプリケーション開発を

リクエストパラメータのバリデーションをアクション側でおこなわないようにする

複雑なバリデーションなら独自の sfRoute クラスの派生クラスが必要 型チェックとか 正規表現とかじゃなくて is_int 使ったりと

か 日付の妥当性チェックとか

Page 19: ルーティングを使ってシンプルなアプリケーション開発を

リクエストメソッドのチェックをアクション側でおこなわないようにする

またもや apps/frontend/config/routing.yml でルーティングルールの設定 クラスに sfRequestRoute を指定すればで

きます

Page 20: ルーティングを使ってシンプルなアプリケーション開発を

アクション名やバリデーション処理の共通化

sfRouteCollection を使う ルーティングの設定類をまとめたクラス

これを apps/frontend/config/routing.yml で指定することで、一気に複数のルーティング設定がおこなわれる

ORM 毎に sf****RouteCollection 的なクラスが用意されているのでそれを使うのが手っ取り早い

list new create edit update delete show

Page 21: ルーティングを使ってシンプルなアプリケーション開発を

アクション名やバリデーション処理の共通化

これだけ

有効にするルールを指定することも

Page 22: ルーティングを使ってシンプルなアプリケーション開発を

最後に注意事項

今まで紹介してきたようにルーティングの設定をおこなってアクションへのアクセス制御をおこなう場合、必ず「 symfony デフォルトのルーティング設定を無効化」してください

ルーティングルールにマッチしなかった場合、 symfony は別のルールにマッチするかどうかチェックして……ということを繰り返していきます。最終的にどのルールにもマッチしなければ無事 404 になりますが、 symfony デフォルトの設定が残っている場合、 /:module/:action などの URL により予期しない形でアクセスされてしまいます

ですので、指定したルーティングルール経由でしかアクションのアクセスを認めない場合 symfony デフォルトのルーティング設定を無効にしなければなりません 

Page 23: ルーティングを使ってシンプルなアプリケーション開発を

まとめ リクエストからレコードを取得

それ sfObjectRoute でできるよ! レコードの存在チェック

それ sfObjectRoute でできるよ! リクエストのバリデーション

sfRoute の正規表現などでできるよ! 独自のルーティングクラスでもできるよ!

リクエストメソッドのチェック それ sfRequestRoute でできるよ!

アクション名やバリデーション処理の共通化 sfRouteCollection でやりやすくなるよ!

Page 24: ルーティングを使ってシンプルなアプリケーション開発を

質疑応答タイム

気軽にどうぞ!