symfony study 090518

29
symfony 1.2 の イベントを使ってみた 株式会社エクスギア 前田 2009/05/18 2009516日土曜日

Upload: masao-maeda

Post on 15-Jan-2015

739 views

Category:

Technology


0 download

DESCRIPTION

20090518 symfony study meeting

TRANSCRIPT

Page 1: Symfony Study 090518

symfony 1.2 のイベントを使ってみた

株式会社エクスギア 前田2009/05/18

2009年5月16日土曜日

Page 2: Symfony Study 090518

自己紹介

• id:brtRiver• おやぢ組の人•ユニコーン大好き• symfonyとCakePHPが好き

2009年5月16日土曜日

Page 3: Symfony Study 090518

お題

•symfonyを拡張する方法について• Eventについて • symfony1.0と1.1以降の違い

2009年5月16日土曜日

Page 4: Symfony Study 090518

symfonyを拡張?

•フレームワークを利用するときによくあること

•フレームワークのコア部分をどのように拡張するか

2009年5月16日土曜日

Page 5: Symfony Study 090518

symfonyを拡張?

•時間も無いし、とにかく動作すればいい

•コアファイルを直接書き換える

フレームワークのアップデートが大変になる

やってはイケナイ!

2009年5月16日土曜日

Page 6: Symfony Study 090518

symfonyの拡張方法

•フィルター•自前クラス(factories.yml)•Mixin (symfony 1.0.X)•Event (symfony 1.1.X~)

2009年5月16日土曜日

Page 7: Symfony Study 090518

フィルター

filters.ymlで独自のフィルタを追加可能・モバイル用コンテンツフィルター

2009年5月16日土曜日

Page 8: Symfony Study 090518

自前クラス(factories.yml)

・セッションのタイムアウト時間の変更 ・sfSessionStorage => mySessionStorage

2009年5月16日土曜日

Page 9: Symfony Study 090518

Mixin

多重継承っぽい拡張を可能にする

2009年5月16日土曜日

Page 10: Symfony Study 090518

PHPは多重継承するとエラー

MixinでNovelクラスにgetISBNメソッドを追加2009年5月16日土曜日

Page 11: Symfony Study 090518

Event•オブザーバーパターン•PearでいうEvent_Dispatcher

•sfEventDispatcherを通して•イベント(sfEvent)を登録•イベントのリスナーを登録(connect)

イベント発生時にリスナーを呼び出す2009年5月16日土曜日

Page 12: Symfony Study 090518

Eventの種類

•Notify•リスナーを順次実行

•NotifyUntil•trueが返されるまでリスナーを順次実行

•Filter•値にフィルタ処理を行いフィルタ結果を戻す

2009年5月16日土曜日

Page 13: Symfony Study 090518

EventsfDispatcher

sfEventsfRequest request.filter_parameter

sfEventrequest.method_not_found

イベント登録

myRequest::methodNotFound()

リスナー登録mobRequest::methodNo

tFound()

1つのイベントに複数のリスナーを登録できる登録したリスナーは順番に実行される

2009年5月16日土曜日

Page 14: Symfony Study 090518

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

2009年5月16日土曜日

Page 16: Symfony Study 090518

Event

例外(sfException)が発生した場合にメールで通知する

Eventでの拡張例:

2009年5月16日土曜日

Page 17: Symfony Study 090518

Event1. 用意されいているイベントを調べる

2009年5月16日土曜日

Page 18: Symfony Study 090518

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

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

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

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

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

Event

symfony2 ではeventを多用

2009年5月16日土曜日

Page 24: Symfony Study 090518

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

phpquebec-2009-symfony-2.pdf

2009年5月16日土曜日

Page 26: Symfony Study 090518

symfonyのフィルター

2009年5月16日土曜日

Page 27: Symfony Study 090518

symfony2でのEvent

2009年5月16日土曜日

Page 28: Symfony Study 090518

Eventまとめ

•Mixinよりも柔軟な拡張が可能•詳しくはThe Definitive Guide 17章参照•プラグインなどを作るときにも自前のイベントを用意しておくと便利•symfony2ではEventは必須っぽい

2009年5月16日土曜日

Page 29: Symfony Study 090518

ご清聴ありがとうございました.

2009年5月16日土曜日