Download - Symfony Study 090518
![Page 1: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/1.jpg)
symfony 1.2 のイベントを使ってみた
株式会社エクスギア 前田2009/05/18
2009年5月16日土曜日
![Page 2: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/2.jpg)
自己紹介
• id:brtRiver• おやぢ組の人•ユニコーン大好き• symfonyとCakePHPが好き
2009年5月16日土曜日
![Page 3: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/3.jpg)
お題
•symfonyを拡張する方法について• Eventについて • symfony1.0と1.1以降の違い
2009年5月16日土曜日
![Page 4: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/4.jpg)
symfonyを拡張?
•フレームワークを利用するときによくあること
•フレームワークのコア部分をどのように拡張するか
2009年5月16日土曜日
![Page 5: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/5.jpg)
symfonyを拡張?
•時間も無いし、とにかく動作すればいい
•コアファイルを直接書き換える
フレームワークのアップデートが大変になる
やってはイケナイ!
2009年5月16日土曜日
![Page 6: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/6.jpg)
symfonyの拡張方法
•フィルター•自前クラス(factories.yml)•Mixin (symfony 1.0.X)•Event (symfony 1.1.X~)
2009年5月16日土曜日
![Page 7: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/7.jpg)
フィルター
filters.ymlで独自のフィルタを追加可能・モバイル用コンテンツフィルター
2009年5月16日土曜日
![Page 8: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/8.jpg)
自前クラス(factories.yml)
・セッションのタイムアウト時間の変更 ・sfSessionStorage => mySessionStorage
2009年5月16日土曜日
![Page 9: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/9.jpg)
Mixin
多重継承っぽい拡張を可能にする
2009年5月16日土曜日
![Page 10: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/10.jpg)
PHPは多重継承するとエラー
MixinでNovelクラスにgetISBNメソッドを追加2009年5月16日土曜日
![Page 11: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/11.jpg)
Event•オブザーバーパターン•PearでいうEvent_Dispatcher
•sfEventDispatcherを通して•イベント(sfEvent)を登録•イベントのリスナーを登録(connect)
イベント発生時にリスナーを呼び出す2009年5月16日土曜日
![Page 12: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/12.jpg)
Eventの種類
•Notify•リスナーを順次実行
•NotifyUntil•trueが返されるまでリスナーを順次実行
•Filter•値にフィルタ処理を行いフィルタ結果を戻す
2009年5月16日土曜日
![Page 13: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/13.jpg)
EventsfDispatcher
sfEventsfRequest request.filter_parameter
sfEventrequest.method_not_found
イベント登録
myRequest::methodNotFound()
リスナー登録mobRequest::methodNo
tFound()
1つのイベントに複数のリスナーを登録できる登録したリスナーは順番に実行される
2009年5月16日土曜日
![Page 14: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/14.jpg)
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日土曜日
![Page 15: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/15.jpg)
2009年5月16日土曜日
![Page 16: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/16.jpg)
Event
例外(sfException)が発生した場合にメールで通知する
Eventでの拡張例:
2009年5月16日土曜日
![Page 17: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/17.jpg)
Event1. 用意されいているイベントを調べる
2009年5月16日土曜日
![Page 18: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/18.jpg)
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日土曜日
![Page 19: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/19.jpg)
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日土曜日
![Page 20: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/20.jpg)
Event複数のリスナーを登録することも可能
// extends response $this->dispatcher->connect('response.filter_content', array('myMobile', 'outputToSJIS')); $this->dispatcher->connect('response.filter_content', array('myMobile', 'convertKana'));
2009年5月16日土曜日
![Page 21: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/21.jpg)
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日土曜日
![Page 22: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/22.jpg)
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日土曜日
![Page 23: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/23.jpg)
Event
symfony2 ではeventを多用
2009年5月16日土曜日
![Page 24: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/24.jpg)
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日土曜日
![Page 25: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/25.jpg)
phpquebec-2009-symfony-2.pdf
2009年5月16日土曜日
![Page 26: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/26.jpg)
symfonyのフィルター
2009年5月16日土曜日
![Page 27: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/27.jpg)
symfony2でのEvent
2009年5月16日土曜日
![Page 28: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/28.jpg)
Eventまとめ
•Mixinよりも柔軟な拡張が可能•詳しくはThe Definitive Guide 17章参照•プラグインなどを作るときにも自前のイベントを用意しておくと便利•symfony2ではEventは必須っぽい
2009年5月16日土曜日
![Page 29: Symfony Study 090518](https://reader033.vdocument.in/reader033/viewer/2022061218/54b772a04a7959df648b4585/html5/thumbnails/29.jpg)
ご清聴ありがとうございました.
2009年5月16日土曜日