Caution: You are browsing the legacy symfony 1.x part of this website.

イベント

1.2
Symfony version
1.4
Language

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();

イベント

application

application.log

通知メソッド: notify

デフォルトの通知元クラス: たくさんのクラス

パラメーター 説明
priority 優先順位(sfLogger::EMERGsfLogger::ALERTsfLogger::CRITsfLogger::ERRsfLogger::WARNINGsfLogger::NOTICEsfLogger::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::EMERGsfLogger::ALERTsfLogger::CRITsfLogger::ERRsfLogger::WARNINGsfLogger::NOTICEsfLogger::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 キャッシュの種類(allconfigi18nroutingmoduletemplate)
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イベントが通知されます。