symfony study 090518

Post on 15-Jan-2015

739 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

20090518 symfony study meeting

TRANSCRIPT

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('hoge@example.com', $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日土曜日

top related