モデルのいくつかのメソッドを上書きしようとしていますが、他のモジュールとの互換性を最大限に高めるために、モデルの上書きや書き換えを避けるという使命を負っています。
モデルを Magento からロードした後に単純に装飾するのが最善の方法であると考えましたが、Magento のオブザーバー パターンの記述方法が原因で、これを達成することは不可能です。(Magento は常に への参照を返すため$this
)、インターフェイスの欠如も後で問題を引き起こす可能性がありますか? Mage/Core/Model/Abstract.php のこの部分を参照してください
/**
* Processing object after load data
*
* @return Mage_Core_Model_Abstract
*/
protected function _afterLoad()
{
Mage::dispatchEvent('model_load_after', array('object'=>$this));
Mage::dispatchEvent($this->_eventPrefix.'_load_after', $this->_getEventData());
return $this;
}
私の質問はタイトルに要約されます.これを達成するためのまともな方法はありますか.
私が行きたい道は次のとおりです。
- イベント時
[model]_load_after
- 戻る
new Decorator($event->getObject())
私の場合のデコレータクラスは次のようになります。
public function __construct(Mage_Sales_Model_Order_Invoice $model)
{
parent::__construct($model); // sets $this->model on parent class, see below
}
// overwrite the getIncrementId method
public function getIncrementId()
{
return '12345';
}
// partial of parent class
public function __call($method, array $args)
{
return call_user_func_array(array($this->model, $method), $args);
}
そして、さらに明確にするための疑似コードです。
$model = Mage::getModel('sales/order_invoice')->load(1);
echo get_class($model);
Namespace_Decorator **INSTEAD OF** Mage_Sales_Model_...
echo $model->getIncrementId();
'12345' **INSTEAD OF** '1000001' ( or whatever the format might be )
読んでくれて/コメントしてくれてありがとう。コードのオーバーライドやモデルの書き換えを使わずに、きれいな方法でこれを達成する方法が実際にあることを本当に願っています。
編集:追加の説明
基本的に私が望むのは、いくつかのケースで Decorator のインスタンスを返すことです。そのため、これらのモデルで load() 呼び出しが行われると、常にモデルではなくデコレータのインスタンスが返されます。デコレーターがオーバーライドするメソッド呼び出しのみが返され、その他のメソッド呼び出しは __call を介して装飾されたオブジェクトに「プロキシ」されます。