symfony study 090518
DESCRIPTION
20090518 symfony study meetingTRANSCRIPT
symfony 1.2 のイベントを使ってみた
株式会社エクスギア 前田2009/05/18
2009年5月16日土曜日
自己紹介
• id:brtRiver• おやぢ組の人•ユニコーン大好き• symfonyとCakePHPが好き
2009年5月16日土曜日
お題
•symfonyを拡張する方法について• Eventについて • symfony1.0と1.1以降の違い
2009年5月16日土曜日
symfonyを拡張?
•フレームワークを利用するときによくあること
•フレームワークのコア部分をどのように拡張するか
2009年5月16日土曜日
symfonyを拡張?
•時間も無いし、とにかく動作すればいい
•コアファイルを直接書き換える
フレームワークのアップデートが大変になる
やってはイケナイ!
2009年5月16日土曜日
symfonyの拡張方法
•フィルター•自前クラス(factories.yml)•Mixin (symfony 1.0.X)•Event (symfony 1.1.X~)
2009年5月16日土曜日
フィルター
filters.ymlで独自のフィルタを追加可能・モバイル用コンテンツフィルター
2009年5月16日土曜日
自前クラス(factories.yml)
・セッションのタイムアウト時間の変更 ・sfSessionStorage => mySessionStorage
2009年5月16日土曜日
Mixin
多重継承っぽい拡張を可能にする
2009年5月16日土曜日
PHPは多重継承するとエラー
MixinでNovelクラスにgetISBNメソッドを追加2009年5月16日土曜日
Event•オブザーバーパターン•PearでいうEvent_Dispatcher
•sfEventDispatcherを通して•イベント(sfEvent)を登録•イベントのリスナーを登録(connect)
イベント発生時にリスナーを呼び出す2009年5月16日土曜日
Eventの種類
•Notify•リスナーを順次実行
•NotifyUntil•trueが返されるまでリスナーを順次実行
•Filter•値にフィルタ処理を行いフィルタ結果を戻す
2009年5月16日土曜日
EventsfDispatcher
sfEventsfRequest request.filter_parameter
sfEventrequest.method_not_found
イベント登録
myRequest::methodNotFound()
リスナー登録mobRequest::methodNo
tFound()
1つのイベントに複数のリスナーを登録できる登録したリスナーは順番に実行される
2009年5月16日土曜日
symfony platform 2.0
>= 1.1
platform
sfEventDispatcher
sfRequest sfResponsesfRouting sfUser
sfStorage sfCache
sfI18N
sfForm
sfLogger
sfDatabase
sfValidator sfWidget
sfYAML
sfCoreAutoload
sfOutputEscaper
phpquebec-2009-symfony-2.pdf
2009年5月16日土曜日
2009年5月16日土曜日
Event
例外(sfException)が発生した場合にメールで通知する
Eventでの拡張例:
2009年5月16日土曜日
Event1. 用意されいているイベントを調べる
2009年5月16日土曜日
class frontendConfiguration extends sfApplicationConfiguration{ public function configure() { // extends logger $this->dispatcher->connect('application.throw_exception',
array('myLogwatch', 'listenToThrowException')); }}
frontConfiguration.class.php
2. リスナーを登録する(in configuration file)
2009年5月16日土曜日
class myLogwatch{ static public function listenToThrowException(sfEvent $event) { $exception = $event->getSubject(); $message = $exception->getMessage(); $body = sprintf('{throwException} %s', $message); $subject = 'Logwatch Mail [exception]'; mail('[email protected]', $subject, $body); return false; }...}
3. リスナーを実装する
2009年5月16日土曜日
Event複数のリスナーを登録することも可能
// extends response $this->dispatcher->connect('response.filter_content', array('myMobile', 'outputToSJIS')); $this->dispatcher->connect('response.filter_content', array('myMobile', 'convertKana'));
2009年5月16日土曜日
EventMixinのようにメソッドを追加することも可能
$this->dispatcher->connect('response.method_not_found', array('myMobile', 'listenToMethodNotFound'));
public function executeIndex(sfWebRequest $request) { sfContext::getInstance()->getResponse()->setMobileEnv(); ..... }
frontConfiguration.class.php
actions.class.php
2009年5月16日土曜日
Eventclass myMobile{ static public function listenToMethodNotFound(sfEvent $event) { $method = $event['method']; if (!method_exists(__CLASS__, $method)) return false; self::$method($event->getSubject(), $event['arguments']); return true; } static public function setMobileEnv($response, $arguments) { $response->setContentType('application/xhtml+xml; charset=Shift_JIS'); }
2009年5月16日土曜日
Event
symfony2 ではeventを多用
2009年5月16日土曜日
symfony platform 2.0
>= 1.1
platform
sfEventDispatcher
sfRequest sfResponsesfRouting sfUser
sfStorage sfCache
sfI18N
sfForm
sfLogger
sfDatabase
sfValidator sfWidget
sfYAML
sfCoreAutoload
sfOutputEscaper
phpquebec-2009-symfony-2.pdf
2009年5月16日土曜日
phpquebec-2009-symfony-2.pdf
2009年5月16日土曜日
symfonyのフィルター
2009年5月16日土曜日
symfony2でのEvent
2009年5月16日土曜日
Eventまとめ
•Mixinよりも柔軟な拡張が可能•詳しくはThe Definitive Guide 17章参照•プラグインなどを作るときにも自前のイベントを用意しておくと便利•symfony2ではEventは必須っぽい
2009年5月16日土曜日
ご清聴ありがとうございました.
2009年5月16日土曜日