OpenPNE コード探訪 symfony 開発に役立つ TIPS 日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)
自己紹介 後藤  秀宣
@hidenorigoto
PHPは2000年くらいから
symfonyは、マジメに触っているのは1.2から
日本Symfonyユーザー会   ドキュメント翻訳温泉ツアー♨
  symfony での開発 ↓ ちょっと変わったことをやろうとすると まったくやり方が分からない ハマる
  symfony 嫌い
  ちょっと待った!
   それ、 OpenPNE でもう実装してるよ !
概要 OpenPNEのコードを読んで、symfony開発に役立つTIPSを紹介します
イベントディスパッチャーの仕組み
OpenPNE独自イベントの例
組み込みイベントの使用例
アクション
フィルターチェーン
  イベントディスパッチャー
イベントディスパッチャーとは? symfonyに搭載された機能  symfonyの機能を拡張するための仕組み
デザインパターン「オブザーバーパターン」の実装  (の亜種)
OpenPNEのコアとプラグイン、プラグインとプラグインをつなぐ
Symfony Components  ->Event Dispathcer (C)Sensio
OpenPNEで使われているイベント symfony組み込みのイベント
OpenPNE独自のイベント
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
具体的な使用箇所
1.イベントを活用している例:あしあと あしあと機能をコアに組み込まず、プラグイン化
コア側があしあと機能に依存していない
  イベントのオブザーバー ( リスナー ) を 登録している部分を見てみます
opAshiatoPlugin/config/config.php
opAshiatoPlugin/config/config.php
opAshiatoPlugin/config/config.php
  イベントの通知側は 何をやっている?
イベントの通知側を追ってみる op_actions.post_execute_member_profile op_actions.post_execute_friend_list op_actions.post_execute_diary_show op_actions.post_execute_diary_listMember ↓ それぞれ検索して通知箇所を探す
・・・ ・・・・・ ない?
こたえ op_actions. post_execute_( モジュール )_( アクション ) opExecutionFilter 内から通知
opExecutionFilter::notifyPostExecuteActionEvent
op_actions.post_execute_( モジュール )_( アクション ) OpenPNEのそれぞれのモジュール、アクションにおいて、アクションの実行後に通知されるイベント
イベント通知側で、イベント名を動的に設定している
イベント名にモジュール名、アクション名が含まれているので、コアに組み込まれた特定のモジュール、アクションを実行した後に、何か独自の処理を追加する場合に使える
  このコードでの TIPS
このコードでのTIPS 「すべてのアクション実行後に何かする」  ->Executionフィルターを拡張する  ->共通処理だけなら、これだけでOK
モジュールごと、アクションごとで使い分けられるイベントがあると何かと便利  ※大きなソフトウェア
コア=汎用的  プラグイン=目的特化  という設計  ※コア側に「ashiato*」のようなイベントを作らない    プラグイン側でコアの汎用イベントを監視
   イベントの使用例2
2.他のイベント使用例 task.cache.clear ↑ symfony 組み込みイベント
task.cache.clear オブザーバー(リスナー)の登録 opApplicationConfiguration::initialize  ->clearPluginCacheリスナー  ->clearWebCacheリスナー リスナー clearPluginCache プラグインキャッシュをクリア
clearWebCache ウェブキャッシュをクリア
  このコードでの TIPS
このコードでのTIPS symfonyの組み込みイベントを使うと symfonyの組み込み機能をクラスの継承や badノウハウを使わずにエレガントに拡張できる ※このようなイベントを持っているタスクは他にはないことに注意 組み込みイベントの一覧 http://www.symfony-project.org/reference/1_4/ja/15-Events#chapter_15_e18b1ea15d9c1dddf7fad47d3ea1043ca30184e6

Symfony 1.4 TIPS from Openpne Source Code