2

これは質問であり、一種の答えでもあります。しかし、私はまだより良い解決策を見つけたいと思っています。あなたはこれに光を当てるかもしれません.

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$observerNamespace_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の方法はありますか?

4

1 に答える 1

1

との残念な切断argsは... 残念です。<args>ノードは痕跡のようです。ただし、パラメーターに応じていくつかの動作のいずれかを実行する単一のメソッドがある場合は、それらの異なるアクティビティを個別のメソッドに含めることが適切な場合があります。そうは言っても、同じ方法で観察/消費したいイベントごとに個別の完全な構成が必要になるのに対し、3 つのオプションがあります。

イベントごとに同じメソッドを呼び出し、 を使用してイベント名をテストすることで、オブザーバー メソッド内の動作を制御し$observer->getEvent()->getName()ます。

各イベント オブザーバー構成で個別のメソッドを呼び出し、これらのメソッドが動作を含むメソッドを内部的に呼び出すようにし、どの動作を示すかを示す引数を渡すだけです。

引数を取得するように xpath 参照を修正します。

Mage::getConfig()->getNode('global/events/'.$observer->getEvent()->getName().'/observers/your_config/args');

また

Mage::getConfig()->getXpath('global/events/'.$observer->getEvent()->getName().'//args');
$args = $cfg[0];

後者は、を含む特定のイベントのグローバル オブザーバー構成argsから取得されることに注意してください。ノード内に引数を含めるノードを追加し、それを xpath の一部として使用することもできますが、他のモジュールが を使用する可能性は低く、ましてやモジュールの処理に影響を与える params を渡すことはありません。argsargs args

于 2012-08-10T23:11:04.353 に答える