SlideShare uma empresa Scribd logo
1 de 24
ルーティングを使って
シンプルなアプリケーション開発を
  株式会社手嶋屋海老原昂輔
  <ebihara@tejimaya.com>
Who am I?
   海老原昂輔 (KousukeEbihara)
   21歳
   17歳(高校2年)の冬より有限会社手嶋屋
    (当時)にアルバイトとして勤務し、
    OpenPNEと出会う
   私立日本大学芸術学部演劇学科を中退、
    2008年10月に株式会社手嶋屋に入社し、
    今に至る
OSS 活動
   OpenPNE3 Platform の生みの親
   OpenPNE2, OpenPNE3 の lead developer
   (OpenPNE3) opCommunityTopicPluginの臨時
    lead developer
   関連する OSS プロジェクトへのパッチ提供
       symfony
       Doctrine
       PHP Shindig
       Chiara_PEAR_Server
それでは本題
   今日はみなさんにsymfonyのルーティング
    の素晴らしさを訴えかける人として来ま
    した
       ただし OpenPNE3 では全然使いこなしてい
        ないところも残ってるけど……><
   基本的にはsymfony 1.2 を前提に解説しま
    す
ところでみなさん、こんな
アクションを書いてませんか?
ところでみなさん、こんな
アクションを書いてませんか?
ところでみなさん、こんな
アクションを書いてませんか?
みなさんのアクションは
        統一が取れてますか?
   member モジュールのメンバー追加用アク
    ションは create なのに、 diary モジュー
    ルだと対応するアクションが insert に
    なっている
   member モジュールと diary モジュールの
    表示用アクション show は同じパラメータ
    を取るにもかかわらずバリデーション
    ルールが統一されていない
ルーティングをうまく使うと
   特定のリクエストパラメータからデータベー
    スのレコードを取得する処理や、レコードの
    存在チェックをアクション側でおこなわなく
    て済む
   リクエストパラメータに関するバリデーショ
    ンをアクション側でおこなわなくて済む
   リクエストメソッドのチェックをアクション
    側でおこなわなくて済む
   アクション名やバリデーション処理を共通化
    しやすくなる
レコード取得をアクション側で
     おこなわないようにする
   apps/frontend/config/routing.ymlでルー
    ティングルールの設定をおこなう
       ルール処理用のクラスとしてsfObjectRouteを
        使うよう設定
           ここでは Doctrine に特化したsfDoctrineRouteとい
            うsfObjectRouteの派生クラスを例に取ります
       対象となるモデルの設定等もおこなう
レコード取得をアクション側で
     おこなわないようにする
   こんな感じの設定になるはず
レコード取得をアクション側で
     おこなわないようにする
   アクション側で簡単アクセス



   これすら面倒であればpreExecute() に書
    いたってよい
       アクション毎のパラメータの違いとかモデル
        の違いとかは全部ルーティング側で吸収して
        くれているので扱いやすいはず
レコード取得をアクション側で
     おこなわないようにする
   いろんなリクエストパラメータを組み合
    わせてレコードを取得したい場合
       指定したモデルに実在するフィールド名と同
        じ名前のリクエストパラメータを指定した場
        合、そのパラメータの値でレコードが絞り込
        まれる
        e.g. /member/birthday/1988-04-23
       ただし別モデルへの問い合わせが必要になる
        など、場合によってはsfObjectRouteクラスの
        派生クラスの作成が必要になる
レコードの存在チェックを
    アクション側でおこなわないようにする
   実はもうできています
       sfObjectRouteは、デフォルトではレコードが
        取得できなかった場合に sfError404Exception
        をスローします
レコードの存在チェックを
アクション側でおこなわないようにする
   ということは最初の show アクションはこ
    うすることも可能ですね!
レコードの存在チェックを
      おこなわないようにする
   レコードが取得できなくてもよい場合は
    以下のように設定すればOK
リクエストパラメータのバリデーションを
アクション側でおこなわないようにする
   簡単なバリデーションなら正規表現を
    使って設定に書ける
リクエストパラメータのバリデーションを
アクション側でおこなわないようにする
   複雑なバリデーションなら独自のsfRoute
    クラスの派生クラスが必要
       型チェックとか
       正規表現とかじゃなくてis_int使ったりとか
       日付の妥当性チェックとか
リクエストメソッドのチェックを
    アクション側でおこなわないようにする
   またもや apps/frontend/config/routing.yml
    でルーティングルールの設定
       クラスにsfRequestRouteを指定すればできま
        す
アクション名やバリデーション処理
              の共通化
   sfRouteCollectionを使う
       ルーティングの設定類をまとめたクラス
           これを apps/frontend/config/routing.ymlで指定すること
            で、一気に複数のルーティング設定がおこなわれる
       ORM 毎にsf****RouteCollection的なクラスが用意
        されているのでそれを使うのが手っ取り早い
           list
           new
           create
           edit
           update
           delete
           show
アクション名やバリデーション処理
          の共通化
   これだけ




   有効にするルールを指定することも
最後に注意事項

   今まで紹介してきたようにルーティングの設定をおこ
    なってアクションへのアクセス制御をおこなう場合、
    必ず「symfonyデフォルトのルーティング設定を無効
    化」してください
   ルーティングルールにマッチしなかった場合、
    symfonyは別のルールにマッチするかどうかチェック
    して……ということを繰り返していきます。最終的に
    どのルールにもマッチしなければ無事 404 になります
    が、symfonyデフォルトの設定が残っている場合、
     /:module/:action などのURLにより予期しない形でア
    クセスされてしまいます
   ですので、指定したルーティングルール経由でしかア
    クションのアクセスを認めない場合symfonyデフォル
    トのルーティング設定を無効にしなければなりません
まとめ
   リクエストからレコードを取得
       それsfObjectRouteでできるよ!
   レコードの存在チェック
       それsfObjectRouteでできるよ!
   リクエストのバリデーション
       sfRouteの正規表現などでできるよ!
       独自のルーティングクラスでもできるよ!
   リクエストメソッドのチェック
       それsfRequestRouteでできるよ!
   アクション名やバリデーション処理の共通化
       sfRouteCollectionでやりやすくなるよ!
質疑応答タイム




     気軽に
    どうぞ!

Mais conteúdo relacionado

Mais procurados

enNetforum Wakamatsu Presentation
enNetforum Wakamatsu PresentationenNetforum Wakamatsu Presentation
enNetforum Wakamatsu PresentationForum
 
enNetforum Fukuoka Panelist
enNetforum Fukuoka PanelistenNetforum Fukuoka Panelist
enNetforum Fukuoka PanelistForum
 
テスト駆動開発のエッセンス
テスト駆動開発のエッセンステスト駆動開発のエッセンス
テスト駆動開発のエッセンスhiroyuki Yamamoto
 
あなたにもできるアジャイルプラクティス2008
あなたにもできるアジャイルプラクティス2008あなたにもできるアジャイルプラクティス2008
あなたにもできるアジャイルプラクティス2008Seiji Kaneko
 
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介devsumi2009
 
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~devsumi2009
 
Ordinary Management
Ordinary ManagementOrdinary Management
Ordinary ManagementKoichi ITO
 
Newb CMS eco Business Solution
Newb CMS eco Business SolutionNewb CMS eco Business Solution
Newb CMS eco Business SolutionKanji Syuto
 
Meet Charlie Japanese
Meet Charlie JapaneseMeet Charlie Japanese
Meet Charlie Japaneseiug
 
GIGAPOD OFFICEHARD
GIGAPOD OFFICEHARDGIGAPOD OFFICEHARD
GIGAPOD OFFICEHARDtripodworks
 
Persona design method / ペルソナ概論
Persona design method / ペルソナ概論Persona design method / ペルソナ概論
Persona design method / ペルソナ概論Katsumi TAZUKE
 
10分でわかるやりたいこと支援サークル
10分でわかるやりたいこと支援サークル10分でわかるやりたいこと支援サークル
10分でわかるやりたいこと支援サークルidealchanger
 
2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&APreferred Networks
 
Loftwork 20090416
Loftwork 20090416Loftwork 20090416
Loftwork 20090416武 河野
 

Mais procurados (17)

enNetforum Wakamatsu Presentation
enNetforum Wakamatsu PresentationenNetforum Wakamatsu Presentation
enNetforum Wakamatsu Presentation
 
enNetforum Fukuoka Panelist
enNetforum Fukuoka PanelistenNetforum Fukuoka Panelist
enNetforum Fukuoka Panelist
 
テスト駆動開発のエッセンス
テスト駆動開発のエッセンステスト駆動開発のエッセンス
テスト駆動開発のエッセンス
 
あなたにもできるアジャイルプラクティス2008
あなたにもできるアジャイルプラクティス2008あなたにもできるアジャイルプラクティス2008
あなたにもできるアジャイルプラクティス2008
 
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
【12-E-2】 SEC流品質作りこみESQR 組込みソフトウェア開発向け品質作り込みガイドの紹介
 
Agc紹介
Agc紹介Agc紹介
Agc紹介
 
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
【12-E-6】 ERP導入の投資対効果 ~SAPの導入事例を元に~
 
Ordinary Management
Ordinary ManagementOrdinary Management
Ordinary Management
 
Newb CMS eco Business Solution
Newb CMS eco Business SolutionNewb CMS eco Business Solution
Newb CMS eco Business Solution
 
地域サイト運営にあたって
地域サイト運営にあたって地域サイト運営にあたって
地域サイト運営にあたって
 
Meet Charlie Japanese
Meet Charlie JapaneseMeet Charlie Japanese
Meet Charlie Japanese
 
GIGAPOD OFFICEHARD
GIGAPOD OFFICEHARDGIGAPOD OFFICEHARD
GIGAPOD OFFICEHARD
 
Persona design method / ペルソナ概論
Persona design method / ペルソナ概論Persona design method / ペルソナ概論
Persona design method / ペルソナ概論
 
10分でわかるやりたいこと支援サークル
10分でわかるやりたいこと支援サークル10分でわかるやりたいこと支援サークル
10分でわかるやりたいこと支援サークル
 
SIG-SWO-A801-04
SIG-SWO-A801-04SIG-SWO-A801-04
SIG-SWO-A801-04
 
2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A2009年4月8日セミナー 4.レコメンデーション Q&A
2009年4月8日セミナー 4.レコメンデーション Q&A
 
Loftwork 20090416
Loftwork 20090416Loftwork 20090416
Loftwork 20090416
 

Mais de Kousuke Ebihara

お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかKousuke Ebihara
 
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...Kousuke Ebihara
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)Kousuke Ebihara
 
Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1Kousuke Ebihara
 
Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Kousuke Ebihara
 
OAuthで気持ちのいい アクセス制御を
OAuthで気持ちのいいアクセス制御をOAuthで気持ちのいいアクセス制御を
OAuthで気持ちのいい アクセス制御をKousuke Ebihara
 
Php5.3ってなんなんだー
Php5.3ってなんなんだーPhp5.3ってなんなんだー
Php5.3ってなんなんだーKousuke Ebihara
 

Mais de Kousuke Ebihara (9)

お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのかお前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
 
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
XML と PHP のイケナイ関係 (セキュリティ的な意味で) -Introduction of XXE attack and XML Bomb with...
 
Open pne3 with_symfony
Open pne3 with_symfonyOpen pne3 with_symfony
Open pne3 with_symfony
 
Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)Let's creating your own PHP (tejimaya version)
Let's creating your own PHP (tejimaya version)
 
Hybrid Onboarding
Hybrid OnboardingHybrid Onboarding
Hybrid Onboarding
 
Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1Using Symfony Templating On Symfony 1
Using Symfony Templating On Symfony 1
 
Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?Introduction of symfony development process & What's symfony 1.3?
Introduction of symfony development process & What's symfony 1.3?
 
OAuthで気持ちのいい アクセス制御を
OAuthで気持ちのいいアクセス制御をOAuthで気持ちのいいアクセス制御を
OAuthで気持ちのいい アクセス制御を
 
Php5.3ってなんなんだー
Php5.3ってなんなんだーPhp5.3ってなんなんだー
Php5.3ってなんなんだー
 

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

  • 2. Who am I?  海老原昂輔 (KousukeEbihara)  21歳  17歳(高校2年)の冬より有限会社手嶋屋 (当時)にアルバイトとして勤務し、 OpenPNEと出会う  私立日本大学芸術学部演劇学科を中退、 2008年10月に株式会社手嶋屋に入社し、 今に至る
  • 3. OSS 活動  OpenPNE3 Platform の生みの親  OpenPNE2, OpenPNE3 の lead developer  (OpenPNE3) opCommunityTopicPluginの臨時 lead developer  関連する OSS プロジェクトへのパッチ提供  symfony  Doctrine  PHP Shindig  Chiara_PEAR_Server
  • 4. それでは本題  今日はみなさんにsymfonyのルーティング の素晴らしさを訴えかける人として来ま した  ただし OpenPNE3 では全然使いこなしてい ないところも残ってるけど……><  基本的にはsymfony 1.2 を前提に解説しま す
  • 8. みなさんのアクションは 統一が取れてますか?  member モジュールのメンバー追加用アク ションは create なのに、 diary モジュー ルだと対応するアクションが insert に なっている  member モジュールと diary モジュールの 表示用アクション show は同じパラメータ を取るにもかかわらずバリデーション ルールが統一されていない
  • 9. ルーティングをうまく使うと  特定のリクエストパラメータからデータベー スのレコードを取得する処理や、レコードの 存在チェックをアクション側でおこなわなく て済む  リクエストパラメータに関するバリデーショ ンをアクション側でおこなわなくて済む  リクエストメソッドのチェックをアクション 側でおこなわなくて済む  アクション名やバリデーション処理を共通化 しやすくなる
  • 10. レコード取得をアクション側で おこなわないようにする  apps/frontend/config/routing.ymlでルー ティングルールの設定をおこなう  ルール処理用のクラスとしてsfObjectRouteを 使うよう設定  ここでは Doctrine に特化したsfDoctrineRouteとい うsfObjectRouteの派生クラスを例に取ります  対象となるモデルの設定等もおこなう
  • 11. レコード取得をアクション側で おこなわないようにする  こんな感じの設定になるはず
  • 12. レコード取得をアクション側で おこなわないようにする  アクション側で簡単アクセス  これすら面倒であればpreExecute() に書 いたってよい  アクション毎のパラメータの違いとかモデル の違いとかは全部ルーティング側で吸収して くれているので扱いやすいはず
  • 13. レコード取得をアクション側で おこなわないようにする  いろんなリクエストパラメータを組み合 わせてレコードを取得したい場合  指定したモデルに実在するフィールド名と同 じ名前のリクエストパラメータを指定した場 合、そのパラメータの値でレコードが絞り込 まれる e.g. /member/birthday/1988-04-23  ただし別モデルへの問い合わせが必要になる など、場合によってはsfObjectRouteクラスの 派生クラスの作成が必要になる
  • 14. レコードの存在チェックを アクション側でおこなわないようにする  実はもうできています  sfObjectRouteは、デフォルトではレコードが 取得できなかった場合に sfError404Exception をスローします
  • 15. レコードの存在チェックを アクション側でおこなわないようにする  ということは最初の show アクションはこ うすることも可能ですね!
  • 16. レコードの存在チェックを おこなわないようにする  レコードが取得できなくてもよい場合は 以下のように設定すればOK
  • 17. リクエストパラメータのバリデーションを アクション側でおこなわないようにする  簡単なバリデーションなら正規表現を 使って設定に書ける
  • 18. リクエストパラメータのバリデーションを アクション側でおこなわないようにする  複雑なバリデーションなら独自のsfRoute クラスの派生クラスが必要  型チェックとか  正規表現とかじゃなくてis_int使ったりとか  日付の妥当性チェックとか
  • 19. リクエストメソッドのチェックを アクション側でおこなわないようにする  またもや apps/frontend/config/routing.yml でルーティングルールの設定  クラスにsfRequestRouteを指定すればできま す
  • 20. アクション名やバリデーション処理 の共通化  sfRouteCollectionを使う  ルーティングの設定類をまとめたクラス  これを apps/frontend/config/routing.ymlで指定すること で、一気に複数のルーティング設定がおこなわれる  ORM 毎にsf****RouteCollection的なクラスが用意 されているのでそれを使うのが手っ取り早い  list  new  create  edit  update  delete  show
  • 21. アクション名やバリデーション処理 の共通化  これだけ  有効にするルールを指定することも
  • 22. 最後に注意事項  今まで紹介してきたようにルーティングの設定をおこ なってアクションへのアクセス制御をおこなう場合、 必ず「symfonyデフォルトのルーティング設定を無効 化」してください  ルーティングルールにマッチしなかった場合、 symfonyは別のルールにマッチするかどうかチェック して……ということを繰り返していきます。最終的に どのルールにもマッチしなければ無事 404 になります が、symfonyデフォルトの設定が残っている場合、 /:module/:action などのURLにより予期しない形でア クセスされてしまいます  ですので、指定したルーティングルール経由でしかア クションのアクセスを認めない場合symfonyデフォル トのルーティング設定を無効にしなければなりません
  • 23. まとめ  リクエストからレコードを取得  それsfObjectRouteでできるよ!  レコードの存在チェック  それsfObjectRouteでできるよ!  リクエストのバリデーション  sfRouteの正規表現などでできるよ!  独自のルーティングクラスでもできるよ!  リクエストメソッドのチェック  それsfRequestRouteでできるよ!  アクション名やバリデーション処理の共通化  sfRouteCollectionでやりやすくなるよ!
  • 24. 質疑応答タイム 気軽に どうぞ!