これは質問であり、一種の答えでもあります。しかし、私はまだより良い解決策を見つけたいと思っています。あなたはこれに光を当てるかもしれません.
Magento でオブザーバーを作成する場合、それをディスパッチし、モジュールの config.xml ファイルのオブザーバーの宣言で構成された関数を呼び出すメソッドは ですMage_Core_Model_App::dispatchEvent
。
このメソッドには、オブザーバー情報を収集する次のコードビットがあります。
foreach ($eventConfig->observers->children() as $obsName=>$obsConfig) {
$observers[$obsName] = array(
'type' => (string)$obsConfig->type,
'model' => $obsConfig->class ? (string)$obsConfig->class : $obsConfig->getClassName(),
'method'=> (string)$obsConfig->method,
'args' => (array)$obsConfig->args,
);
}
このコードビットは、次のようにオブザーバーで < args > ノードを宣言できることを意味します。
<events>
<event_to_observe>
<observers>
<observer_name>
<type>singleton</type>
<class>Namespace_Module_Model_ObserverClass</class>
<method>observerMethod</method>
<args>
<arg_name>arg_value</arg_name>
</args>
</observer_name>
</observers>
</event_to_observe>
</events>
の後半で、オブザーバーのメソッドを呼び出し、オブジェクトを引数としてMage_Core_Model_App::dispatchEvent
渡すコードを見つけることができます。$observer
しかし、私が正しければ、オブジェクトにもオブジェクトにも$observers[$obsName]['args']
値を設定するコードはありません。結果は次のとおりです。オブザーバー宣言の < args > ノードは、オブザーバーの呼び出されたメソッド (前の例) ではアクセスできません。$event
$observer
Namespace_Module_Model_ObserverClass::observerMethod
私の最初の賭けは、次のようなものを使用して < args > ノードを取得しようとすることでした:
$args = (array) Mage::getConfig()->getXpath('//events/' . $observer->getEvent()->getName() . '/observers/' . $observer->getName() . '/args');
しかし、残念なことに、$name
変数 (プロファイラーにも使用されますMage_Core_Model_App::dispatchEvent
) もオブジェクトに渡されません$observer
...そのため$observer->getName()
、データは返されません。
そこで、< args > ノードを取得するために任意の oberver メソッドが呼び出すことができるヘルパー メソッドを作成することになりました。このヘルパーの要点と使用方法は、次の場所にあります。
https://gist.github.com/3312869
でこのようなものを持っていると、とても簡単になりますMage_Core_Model_App::dispatchEvent
:
オブザーバーメソッドで$observer->setMethodArgs($obs['args'])
使用できるようにします...$observer->getMethodArgs()
または、< args > ノードを取得できるものを見逃したのかもしれませんが、Core コードを検索しても < args > ノードが見つからなかったため、Magento がこの機能を使用していないことを意味します。芯。
さて、問題は...オブザーバー宣言から < args > を取得する簡単でMagento Coreの方法はありますか?