Symfony 1.4 TIPS from Openpne Source Code

2,663 views

Published on

2010/9/2開催 OpenPNE3で学ぶsymfony勉強会(第4回)

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,663
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
18
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Symfony 1.4 TIPS from Openpne Source Code

  1. 1. OpenPNE コード探訪 symfony 開発に役立つ TIPS 日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)
  2. 2. 自己紹介 <ul><li>後藤  秀宣
  3. 3. @hidenorigoto
  4. 4. PHPは2000年くらいから
  5. 5. symfonyは、マジメに触っているのは1.2から
  6. 6. 日本Symfonyユーザー会   ドキュメント翻訳温泉ツアー♨ </li></ul>
  7. 7.   symfony での開発 ↓ ちょっと変わったことをやろうとすると まったくやり方が分からない ハマる
  8. 8.   symfony 嫌い
  9. 9.   ちょっと待った!
  10. 10.    それ、 OpenPNE でもう実装してるよ !
  11. 11. 概要 <ul><li>OpenPNEのコードを読んで、symfony開発に役立つTIPSを紹介します
  12. 12. イベントディスパッチャーの仕組み
  13. 13. OpenPNE独自イベントの例
  14. 14. 組み込みイベントの使用例
  15. 15. アクション
  16. 16. フィルターチェーン </li></ul>
  17. 17.   イベントディスパッチャー
  18. 18. イベントディスパッチャーとは? <ul><li>symfonyに搭載された機能  symfonyの機能を拡張するための仕組み
  19. 19. デザインパターン「オブザーバーパターン」の実装 (の亜種)
  20. 20. OpenPNEのコアとプラグイン、プラグインとプラグインをつなぐ
  21. 21. Symfony Components  ->Event Dispathcer </li></ul>(C)Sensio
  22. 22. OpenPNEで使われているイベント <ul><li>symfony組み込みのイベント
  23. 23. OpenPNE独自のイベント </li></ul>
  24. 24. OpenPNE独自のイベント op_confirmation.list op_confirmation.decision op_action.pre_execute_(ModuleName)_(ActionName) op_action.pre_execute op_action.post_execute_(ModuleName)_(ActionName) op_action.post_execute op_activity.template.filter_body op_activity.filter_body op_doctrine.%s_%s_%s op_message_plugin.decorate_body op_opensocial.removeapp op_opensocial.addappfeeds_action.pre_execute
  25. 25. 具体的な使用箇所
  26. 26. 1.イベントを活用している例:あしあと <ul><li>あしあと機能をコアに組み込まず、プラグイン化
  27. 27. コア側があしあと機能に依存していない </li></ul>
  28. 28.   イベントのオブザーバー ( リスナー ) を 登録している部分を見てみます
  29. 29. opAshiatoPlugin/config/config.php
  30. 30. opAshiatoPlugin/config/config.php
  31. 31. opAshiatoPlugin/config/config.php
  32. 32.   イベントの通知側は 何をやっている?
  33. 33. イベントの通知側を追ってみる op_actions.post_execute_member_profile op_actions.post_execute_friend_list op_actions.post_execute_diary_show op_actions.post_execute_diary_listMember ↓ それぞれ検索して通知箇所を探す
  34. 34. ・・・ ・・・・・ ない?
  35. 35. こたえ op_actions. post_execute_( モジュール )_( アクション ) opExecutionFilter 内から通知
  36. 36. opExecutionFilter::notifyPostExecuteActionEvent
  37. 37. op_actions.post_execute_( モジュール )_( アクション ) <ul><li>OpenPNEのそれぞれのモジュール、アクションにおいて、アクションの実行後に通知されるイベント
  38. 38. イベント通知側で、イベント名を動的に設定している
  39. 39. イベント名にモジュール名、アクション名が含まれているので、コアに組み込まれた特定のモジュール、アクションを実行した後に、何か独自の処理を追加する場合に使える </li></ul>
  40. 40.   このコードでの TIPS
  41. 41. このコードでのTIPS <ul><li>「すべてのアクション実行後に何かする」  ->Executionフィルターを拡張する  ->共通処理だけなら、これだけでOK
  42. 42. モジュールごと、アクションごとで使い分けられるイベントがあると何かと便利  ※大きなソフトウェア
  43. 43. コア=汎用的 プラグイン=目的特化  という設計  ※コア側に「ashiato*」のようなイベントを作らない    プラグイン側でコアの汎用イベントを監視 </li></ul>
  44. 44.    イベントの使用例2
  45. 45. 2.他のイベント使用例 task.cache.clear ↑ symfony 組み込みイベント
  46. 46. task.cache.clear オブザーバー(リスナー)の登録 <ul><li>opApplicationConfiguration::initialize  ->clearPluginCacheリスナー  ->clearWebCacheリスナー </li></ul>リスナー <ul><li>clearPluginCache プラグインキャッシュをクリア
  47. 47. clearWebCache ウェブキャッシュをクリア </li></ul>
  48. 48.   このコードでの TIPS
  49. 49. このコードでのTIPS symfonyの組み込みイベントを使うと symfonyの組み込み機能をクラスの継承や badノウハウを使わずにエレガントに拡張できる ※このようなイベントを持っているタスクは他にはないことに注意 組み込みイベントの一覧 http://www.symfony-project.org/reference/1_4/ja/15-Events#chapter_15_e18b1ea15d9c1dddf7fad47d3ea1043ca30184e6
  50. 50. イベントディスパッチャーの注意点 <ul><li>イベントディスパッチャーを使うには、これを参照できる必要がある
  51. 51. ProjectConfiguration、ApplicationConfiguration周辺で登録
  52. 52. プラグインの場合は、PluginConfigurationか、config/config.phpで登録
  53. 53. これ以外の場合、ディスパッチャーオブジェクトを引き渡すか、sfContext経由で取得する必要がある </li></ul>
  54. 54.    アクション
  55. 55. 3.アクション OpenPNEは、複数のsymfonyアプリケーション <ul><li>pc_frontend  ->PCでアクセスした場合のユーザー側システム
  56. 56. mobile_frontend ->携帯でアクセスした場合のユーザー側システム
  57. 57. pc_backend
  58. 58. api </li></ul>
  59. 59. 共通処理は? pc_frontendとmobile_frontendでは、共通する処理が多数でてくる どう設計する?
  60. 60. こたえ:lib/actionに親クラス <ul><li>lib/action/opCommunityAction  ->PC、携帯に共通するアクションを記述
  61. 61. pc_frontend/・・・/actions.class.php  ->opCommunityActionを継承  ->PC向けの画面遷移アクション等を記述
  62. 62. mobile_frontend/・・・/actions.class.php  ->opCommunityActionを継承  ->携帯向けの画面遷移アクション等を記述
  63. 63. PCも携帯も、モジュール構造は共通にしてある </li></ul>
  64. 64.   このコードでの TIPS
  65. 65. このコードでのTIPS <ul><li>「複数のアクションで共通する処理を使いたい」  ->共通処理を持つ親クラスを /lib/action に作成  ->個別のアクションクラスで、この親クラスを継承  ->親クラスは sfActions を継承 </li></ul>これは、普通のオブジェクト指向のやり方 but 「どのファイルにどう書けばいいかが分からない」
  66. 66.   フィルターチェーン
  67. 67. フィルターチェーン <ul><li>symfony 1.xで、アクションの実行、ページキャッシュ、レスポンス送信など一連の処理を行う
  68. 68. 1つのチェーンが次のチェーンを実行し、結果を受け取る
  69. 69. 「次のチェーンを実行しない」ことも可能  ※キャッシュフィルター
  70. 70. 次のチェーンの実行前と、実行後に、自身の処理を実行可能(このあたりがやや扱いづらい) </li></ul>
  71. 71. フィルターチェーンの処理イメージ
  72. 72. 4. 携帯入出力と絵文字対応フィルター OpenPNEで携帯端末向けに入出力を変換する処理と、絵文字関連の処理がフィルターで実装されている
  73. 73. 使っているクラスなど <ul><li>sfMobileIOFilter  入力:絵文字->内部コード。文字コードを統一。  出力:HTML補正、文字コード変換、ヘッダー補正。
  74. 74. opEmojiFilter  出力:内部コード->絵文字コード
  75. 75. OpenPNE_KtaiEmoji  絵文字←->内部コード の相互変換 </li></ul>
  76. 76.   このコードでの TIPS
  77. 77. このコードでのTIPS <ul><li>「リクエストデータやレスポンスデータに対して変換処理を追加したい」  ->フィルター(チェイン)を追加する
  78. 78. 携帯向けの処理  ->(ライセンスに準じて)OpenPNEの実装を   そのまま使う ※不具合や改善レポートには協力しましょう! </li></ul>
  79. 79.   本日のまとめ
  80. 80. まとめ <ul><li>OpenPNEは、symfony開発のヒントの宝庫!
  81. 81. OpenPNEのソースを読もう(読まなきゃ損!)
  82. 82. (オススメ)気づいたことをブログに書こう
  83. 83. (オススメ)OpenPNEの開発チームにフィードバックしよう
  84. 84. (オススメ)勉強会で簡単でもいいので発表しよう! </li></ul>
  85. 85.   symfony 嫌い
  86. 86. 参考URL A Gentle Introduction to symfony 第17章 symfonyを拡張する ←イベント http://www.symfony-project.org/gentle-introduction/1_4/ja/17-Extending-Symfony 第6章 コントローラーレイヤーの内側 ←フィルター http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_filters
  87. 87. 質問 質問タイム

×