EC-CUBE:プラグインのインスタンスを外部から参照する方法
EC-CUBEでプラグイン開発をやっていると「あれ?この関数って実装されてないの?」という事が時々あります。
その一つが、プラグインのコアクラス・インスタンスを外部(例えばページクラス)から参照すること。
例えば「MyPlugin」というクラスを作った時に、内部からだと「$this」で参照できるんだけど、LC_Page_Exクラスを継承したページからだと、静的に「MyPlugin::」を使ってアクセスするしかない。
でも、コアクラス内のメンバー変数を利用した関数などを利用したいときに困ってしまうわけです。 要するにどっかに存在してるはずなんだけど、どこか分からない!どこだ!?出てこ~い!!な状態なわけです。
ユーティリティクラスを駆使して取得してみる
で、本題ですが、上記の問題を既存のしくみで解決してみます。
まず、EC-CUBE内でプラグインのコアクラス・インスタンスってどこに保持されてるのかというと「$GLOBALS」なんです。
ここにヘルパークラス「SC_Helper_Plugin_Ex」のインスタンスが存在していて、この中に「$arrPluginInstances」というメンバー変数があり、この中にプラグインIDをキーにしたコアクラス・インスタンスのリストが入ってる。
だから、とりあえずこのヘルパークラスのインスタンスを取得して、プラグインIDを使ってゲットするってのが良い方法です。
/** * 生成されているプラグインインスタンスを返す * * @param string $plugin_code プラグインコード名。 * @return mixed インスタンス。失敗したらfalseを返す。 */ function getPluginInstance($plugin_code = '') { $arrPluginData = SC_Plugin_Util_Ex::getPluginByPluginCode($plugin_code); $plugin_id = $arrPluginData['plugin_id']; $objHelperPlugin = SC_Helper_Plugin_Ex::getSingletonInstance(); if (isset($objHelperPlugin->arrPluginInstances[$plugin_id])) { return $objHelperPlugin->arrPluginInstances[$plugin_id]; } else { return false; } }
この関数を(OOP的思考から)どこに所属させるか?
この関数をどこに所属させるのか意外と迷うところなんですよね。
1つ、使い勝手が良さそうなのは「SC_Plugin_Base_Ex」に置いておいて、プラグインのコアクラスを定義する際のスーパークラスにする方法。
こうすると引数であるプラグインのコード名を指定する必要は無いので、シンプルになります。
ただ関数の中身を見れば分かるようにその実装のほとんどは「SC_Plugin_Util_Ex」「SC_Helper_Plugin_Ex」に依存しまくっています。
それにEC-CUBEのソースを読んでいると「メンバー変数を必要とするような処理はヘルパークラスに所属させる」的なコメントがちらほらと出てきます。
そう言われると、この関数は「SC_Plugin_Base」クラスの「arrPluginInstances」メンバー変数をもろに参照しているわけで、個人的には「SC_Plugin_Base_Ex」に記述して利用するのがベストかと思いますね。
ロックオンさん、こんな考えで合ってますか?w
2013-05-14