イベント
sfEventDispatcher オブジェクトのおかげで、symfony のコアコンポーネントは疎結合されています。Event Dispatcher はコアコンポーネントのあいだのコミュニケーションを管理します。
あるオブジェクトがディスパッチャにイベントを通知すれば、ほかのオブジェクトは、ディスパッチャに接続していることで (つながっていることで)、特定のイベントをリスニングできます。
イベントは単なる名前で、ドット (.) で区切られる名前空間と名前で構成されます。
使い方
最初にイベントオブジェクトを作ります:
$event = new sfEvent($this, 'user.change_culture', array('culture' => $culture));
そしてディスパッチャにイベントを通知させます:
$dispatcher->notify($event);
sfEvent コンストラクタは3つの引数をとります:
- イベントの「サブジェクト (対象)」 (ほとんどの場合、これはイベントを通知するオブジェクトになりますが、
nullにもなります) - イベントの名前
- リスナーに渡すパラメータの配列
リスナーにイベントをリスニングさせるために、リスナーをディスパッチャに接続させます (つなげます):
$dispatcher->connect('user.change_culture', array($this, 'listenToChangeCultureEvent'));
ディスパッチャの connect メソッドは2つの引数をとります:
- イベントの名前
- イベントが通知されるときに呼び出される関数/メソッド
リスナーの実装例は次のとおりです:
public function listenToChangeCultureEvent(sfEvent $event) { // メッセージフォーマットオブジェクトを新しいカルチャで変更する $this->setCulture($event['culture']); }
リスナーはイベントを第1引数にとります。イベントオブジェクトはイベント情報を提供するためのメソッドをいくつかもちます:
getSubject(): イベントにアタッチされているサブジェクトオブジェクトを取得します。getParameters(): イベントパラメータを返します。
イベントオブジェクトには配列形式としてもアクセスできます。
イベントの種類
イベントは3つの異なるメソッドによって発生します:
notify()notifyUntil()filter()
~notify~
notify() メソッドはすべてのリスナーに通知します。リスナーは値を返すことはできません。すべてのリスナーの実行は保証されます。
~notifyUntil~
1つのリスナーが true の値を返して、チェーンを止めるまで、notifyUntil() メソッドはすべてのリスナーに通知し続けます。
チェーンを止めるリスナーは setReturnValue() メソッドを呼び出すこともできます。
通知オブジェクトは、isProcessed() メソッドを呼び出すことで、リスナーが処理済みのイベントをもっているかチェックできます:
if ($event->isProcessed()) { // ... }
~filter~
filter() メソッドは、通知オブジェクトによって第2引数に渡される任意の値をフィルタリングし、リスナーの第2引数に渡される関数/メソッドによって結果が読み出されることを通知します。すべてのリスナーは受け取った値をフィルタリングして返さなければなりません。すべてのリスナーの実行は保証されます。
通知オブジェクトは getReturnValue() メソッドを呼び出すことで、フィルタリング済みの値を得ることができます:
$ret = $event->getReturnValue();
イベント
-
application -
command -
configuration -
component -
context -
controller -
form -
plugin -
request -
response -
routing -
task -
template -
user -
view -
view.cache
application
~application.log~
通知メソッド: notify
デフォルトの通知オブジェクト: たくさんのクラス
| パラメータ | 説明 |
|---|---|
priority |
優先順位 (sfLogger::EMERG、sfLogger::ALERT、sfLogger::CRIT、sfLogger::ERR、 sfLogger::WARNING、sfLogger::NOTICE、sfLogger::INFO もしくは sfLogger::DEBUG) |
application.log イベントは、HTTP リクエストのロギングをするために symfony によって利用されるメカニズムです (logger ファクトリを参照)。このイベントは symfony のコアコンポーネントの大半によって通知されます。
~application.throw_exception~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfException
リクエスト処理のあいだに捕まらない例外が投げられるとき、application.throw_exception イベントが通知されます。
このイベントをリスニングすることで、捕まらない例外が投げられたときに特別な対応を行うことができます (メールを送信する、もしくはエラーをロギングするなど)。イベントを処理することで、symfony のデフォルトの例外管理メカニズムをオーバーライドすることもできます。
command
~command.log~
通知メソッド: notify
デフォルトの通知オブジェクト: sfCommand* クラス
| パラメータ | 説明 |
|---|---|
priority |
優先順位 (sfLogger::EMERG、sfLogger::ALERT、sfLogger::CRIT、sfLogger::ERR、 sfLogger::WARNING、sfLogger::NOTICE、sfLogger::INFO もしくは sfLogger::DEBUG) |
command.log イベントは symfony CLI ユーティリティでロギングするために symfony によって利用されるメカニズムです (logger ファクトリを参照)。
~command.pre_command~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfTask
| パラメータ | 説明 |
|---|---|
arguments |
CLI に渡される引数の配列 |
options |
CLI に渡されるオプションの配列 |
タスクの実行直前に command.pre_command イベントが通知されます。
~command.post_command~
通知メソッド: notify
デフォルトの通知オブジェクト: sfTask
タスクの実行直後に command.post_command イベントが通知されます。
~command.filter_options~
通知メソッド: filter
デフォルトの通知オブジェクト: sfTask
| パラメータ | 説明 |
|---|---|
command_manager |
sfCommandManager インスタンス |
タスクオプションが CLI によってパースされる前に command.filter_options イベントが通知されます。このイベントはユーザーに渡すオプションをフィルタリングするために使うことができます。
configuration
~configuration.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfProjectConfiguration
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfProjectConfiguration クラスで定義されていなければ、configuration.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
component
~component.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfComponent
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッド |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfComponent クラスで定義されていないときに component.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
context
~context.load_factories~
通知メソッド: notify
デフォルトの通知オブジェクト: sfContext
すべてのファクトリが初期化された直後から、リクエストがやって来るたびに、sfContext オブジェクトによってcontext.load_factories イベントが1回通知されます。すべてのコアクラスが初期化されるときに、このイベントが最初に通知されます。
controller
~controller.change_action~
通知メソッド: notify
デフォルトの通知オブジェクト: sfController
| パラメータ | 説明 |
|---|---|
module |
実行されるモジュールの名前 |
action |
実行されるアクションの名前 |
アクションが実行される直前に controller.change_action が通知されます。
~controller.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfController
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfController クラスで定義されていなければ、controller.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
~controller.page_not_found~
通知メソッド: notify
デフォルトの通知オブジェクト: sfController
| パラメータ | 説明 |
|---|---|
module |
404エラーを生成するモジュールの名前 |
action |
404エラーを生成するアクションの名前 |
リクエスト処理のあいだに404エラーが生成されたとき、controller.page_not_found が通知されます。
404ページが表示されるとき、メールを送信する、エラー、イベントをロギングするなど何か特別な対応を行うために、このイベントをリスニングできます。
form
~form.post_configure~
通知メソッド: notify
デフォルトの通知オブジェクト: sfFormSymfony
form.post_configure イベントはフォームのコンフィギュレーションが変更されるときに通知されます。
~form.filter_values~
通知メソッド: filter
デフォルトの通知オブジェクト: sfFormSymfony
form.filter_values イベントは、バインドする直前の、マージされ、汚染されているパラメータとファイルの配列をフィルタリングします。
~form.validation_error~
通知メソッド: notify
デフォルトの通知オブジェクト: sfFormSymfony
| パラメータ | 説明 |
|---|---|
error |
エラーのインスタンス |
フォームバリデーションが通らないときに form.validation_error イベントはつねに通知されます。
~form.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfFormSymfony
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfFormSymfony クラスで定義されていなければ、form.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
plugin
~plugin.pre_install~
通知メソッド: notify
デフォルトの通知オブジェクト: sfPluginManager
| パラメータ | 説明 |
|---|---|
channel |
プラグインのチャンネル |
plugin |
プラグインの名前 |
is_package |
ローカルパッケージ (true)、もしくは Web 公開パッケージ (false) をインストールするかどうか |
プラグインがインストールされる直前に plugin.pre_install イベントが通知されます。
~plugin.post_install~
通知メソッド: notify
デフォルトの通知オブジェクト: sfPluginManager
| パラメータ | 説明 |
|---|---|
channel |
プラグインのチャンネル |
plugin |
プラグインの名前 |
プラグインがインストールされた直後に plugin.post_install イベントが通知されます。
~plugin.pre_uninstall~
通知メソッド: notify
デフォルトの通知オブジェクト: sfPluginManager
| パラメータ | 説明 |
|---|---|
channel |
プラグインのチャンネル |
plugin |
プラグインの名前 |
プラグインがアンインストールされる直前に plugin.pre_uninstall イベントが通知されます。
~plugin.post_uninstall~
通知メソッド: notify
デフォルトの通知オブジェクト: sfPluginManager
| パラメータ | 説明 |
|---|---|
channel |
プラグインのチャンネル |
plugin |
プラグインの名前 |
プラグインがアンインストールされた直後に plugin.post_uninstall イベントが通知されます。
request
~request.filter_parameters~
通知メソッド: filter
デフォルトの通知オブジェクト: sfWebRequest
| パラメータ | 説明 |
|---|---|
path_info |
リクエストのパス |
リクエストパラメータが初期化されるときに request.filter_parameters イベントが通知されます。
~request.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfRequest
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfRequest クラスで定義されていなければ、request.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
response
~response.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfResponse
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfResponse クラスで定義されていなければ、response.method_not_found イベントが通知されます。継承を使わなくても、このメソッドをリスニングすることで、クラスにメソッドを追加できます。
~response.filter_content~
通知メソッド: filter
デフォルトの通知オブジェクト: sfResponse
レスポンスが送信される前に response.filter_content イベントが通知されます。このイベントをリスニングすることで、送信される前のレスポンスの内容を操作できます。
routing
~routing.load_configuration~
通知メソッド: notify
デフォルトの通知オブジェクト: sfRouting
ルーティングファクトリがルーティングコンフィギュレーションをロードするときに routing.load_configuration イベントが通知されます。
task
~task.cache.clear~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfCacheClearTask
| パラメータ | 説明 |
|---|---|
app |
アプリケーションの名前 |
type |
キャッシュの種類 (all、config、i18n、routing、module、そして template) |
env |
環境 |
キャッシュが cache:clear タスクによって一掃されるときに task.cache.clear イベントが通知されます。
template
~template.filter_parameters~
通知メソッド: filter
デフォルトの通知オブジェクト: sfViewParameterHolder
ビューファイルがレンダリングされる前に template.filter_parameters イベントが通知されます。このイベントをリスニングすることで、テンプレートに渡される変数へのアクセスおよび操作ができます。
user
~user.change_culture~
通知メソッド: notify
デフォルトの通知オブジェクト: sfUser
| パラメータ | 説明 |
|---|---|
culture |
ユーザーカルチャ |
リクエストのあいだにユーザーカルチャが変更されるときに user.change_culture イベントが通知されます。
~user.method_not_found~
通知メソッド: notifyUntil
デフォルトの通知オブジェクト: sfUser
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfUser クラスで定義されていなければ、user.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
~user.change_authentication~
通知メソッド: notify
デフォルトの通知オブジェクト: sfBasicSecurityUser
| パラメータ | 説明 |
|---|---|
authenticated |
ユーザーが認証されているかどうか |
ユーザーの認証ステータスが変更されるたびに user.change_authentication イベントが通知されます。
view
~view.configure_format~
通知メソッド: notify
デフォルトの通知オブジェクト: sfView
| パラメータ | 説明 |
|---|---|
format |
リクエストされるフォーマット |
response |
レスポンスオブジェクト |
request |
リクエストオブジェクト |
リクエストにおいて sf_format パラメータセットが存在するときに view.configure_format イベントが通知されます。symfony が設定を変更するもしくはレイアウトの設定を解除するなどの単純な作業を行った後にこのイベントが通知されます。このイベントによってリクエストされるフォーマットに合わせてビューとレスポンスオブジェクトを変更することができます。
~view.method_not_found~
通知メソッド: notifyUntil
通知元クラス: sfView
| パラメータ | 説明 |
|---|---|
method |
呼び出されたが見つからないメソッドの名前 |
arguments |
メソッドに渡される引数 |
呼び出されたメソッドが sfView クラスで定義されていなければ、view.method_not_found イベントが通知されます。継承を使わなくても、このイベントをリスニングすることで、クラスにメソッドを追加できます。
view.cache
~view.cache.filter_content~
通知メソッド: filter
デフォルトの通知オブジェクト: sfViewCacheManager
| パラメータ | 説明 |
|---|---|
response |
レスポンスオブジェクト |
uri |
キャッシュ済みのコンテンツの URI |
new |
コンテンツがキャッシュのなかで新しいものであるかどうか |
view.cache.filter_content イベントはキャッシュからコンテンツが読み込まれるときに通知されます。
インデックス
Document Index
関連ページリスト
Related Pages
日本語ドキュメント
Japanese Documents
2011/01/18 Chapter 17 - Extending Symfony
2011/01/18 The generator.yml Configuration File
2011/01/18 Les tâches
2011/01/18 Emails
2010/11/26 blogチュートリアル(8) ビューの作成
リリース情報
Release Information
- 2.0 : 2.0.15(2011/05/30)
Symfony2日本語ドキュメント - 1.4 : 1.4.18(2012/05/30)
Changelog
