symfonyのコアコンポーネントはsfEventDispatcherオブジェクトのおかげで疎結合されています。
Event Dispatcherはコアコンポーネントのあいだのコミュニケーションを管理します。
オブジェクトはディスパッチャーにイベントを通知し、ほかのオブジェクトは特定のイベントをリスニングするためにディスパッチャーに接続できます。
イベントはドット(.)で区切られた名前空間と名前で構成される単なる名前です。
使い方
最初にイベントオブジェクトを作ることでイベントを通知できます:
$event = new sfEvent($this, 'user.change_culture', array('culture' => $culture));
そして通知します:
$dispatcher->notify($event);
sfEventコンストラクターは3つの引数を受け取ります:
- イベントの"subject"(たいていの場合、これはイベントを通知するオブジェクトだが
nullにもなる) - イベントの名前
- リスナーに渡すパラメーターの配列
イベントをリスニングするには、そのイベントの名前に接続します:
$dispatcher->connect('user.change_culture', array($this, 'listenToChangeCultureEvent'));
connectメソッドは2つの引数を受け取ります:
- イベントの名前
- イベントが通知されたときに呼び出すPHP callable
リスナーの実装例は次のとおりです:
public function listenToChangeCultureEvent(sfEvent $event) { // メッセージフォーマットオブジェクトを新しいcultureで変更する $this->setCulture($event['culture']); }
リスナーは最初の引数としてイベントを受け取ります。 イベントオブジェクトはイベントの情報を得るためのメソッドをいくつか持ちます:
getSubject(): イベントに添付するsubjectオブジェクトを取得するgetParameters(): イベントパラメーターを返す
イベントオブジェクトはパラメーターを取得するために配列としてもアクセスできます。
イベントの種類
イベントは3つの異なるメソッドで起動できます:
notify()notifyUntil()filter()
notify
notify()メソッドはすべてのリスナーを通知します。
リスナーは値を返すことはできずすべてのリスナーが実行されることが保証されます。
notifyUntil
notifyUntil()メソッドはtrueの値を返すことで1つのリスナーがチェーンを停止させるまですべてのリスナーを通知します。
チェーンを停止させるリスナーはsetReturnValue()メソッドを呼び出すこともできます。
通知元のオブジェクトはリスナーはisProcessed()メソッドを呼び出すことで処理されたイベントが保有されているかチェックできます:
if ($event->isProcessed()) { // ... }
filter
filter()メソッドはすべてのリスナーを通知します。
これらは任意の値をフィルタリング可能で、通知元オブジェクトによって2番目の引数として渡され、3番目の引数としてリスナーのcallableによって読み取りされます。
すべてのリスナーには値が渡され、これらはフィルタリングされた値を返さなければなりません。
すべてのリスナーの実行は保証されます。
通知元オブジェクトはgetReturnValue()メソッドを呼び出すことでフィルタリングされた値を取得できます:
$ret = $event->getReturnValue();
イベント
applicationcommandconfigurationcomponentcontextcontrollerpluginrequestresponseroutingtasktemplateuserviewview.cache
application
application.log
通知メソッド: notify
デフォルトの通知元クラス: たくさんのクラス
| パラメーター | 説明 |
|---|---|
priority |
優先順位(sfLogger::EMERG、sfLogger::ALERT、sfLogger::CRIT、sfLogger::ERR、 sfLogger::WARNING、sfLogger::NOTICE、sfLogger::INFOもしくはsfLogger::DEBUG) |
application.logイベントはWebリクエストに対してロギングを行うためにsymfonyによって利用されるメカニズムです(loggerファクトリを参照)。
このイベントはたいていのsymfonyのコアコンポーネントによって通知されます。
application.throw_exception
通知メソッド: notifyUntil
デフォルトの通知元クラス: sfException
リクエスト処理のあいだに補足されない例外が投げられるときにapplication.throw_exceptionイベントが通知されます。
補足されない例外が投げられたときに特別なことを行うためにこのイベントをリスニングできます(Emailメールを送信する、もしくはエラーをロギングするなど)。 イベントを処理することで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が通知されます。
Eメールを送信する、エラー、イベントをロギングするなど、404ページが表示されるときに 何か特別なことを行うためにこのイベントをリスニングできます。
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タスクでCLIからキャッシュをクリアするときにtask.cache.clearイベントが通知されます。
template
template.filter_parameters
通知メソッド: filter
デフォルトの通知元クラス: sfViewParameterHolder
ビューファイルがレンダリングされる前にtemplate.filter_parametersイベントが通知されます。
このイベントをリスニングすることでテンプレートに渡される変数にアクセスおよび操作できます。
user
user.change_culture
通知メソッド: notify
デフォルトの通知元クラス: sfUser
| パラメーター | 説明 |
|---|---|
culture |
ユーザーのculture |
リクエストのあいだにユーザーの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イベントが通知されます。
This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License license.