回答:
理論的には、決してヘルパーを使用しないでください。
ヘルパーは無関係なメソッドのコレクションであり、常にシングルトンとしてインスタンス化されます。
これは基本的に、いくつかの名前空間(この場合はクラス名)の下に関数をグループ化した手続き型プログラミングです。ただし、Magentoにはコアにヘルパーが含まれているため、メソッドを配置する場所がわからない場合や、さまざまな場所(モデル、コントローラー、テンプレート)で呼び出す必要がある場合にメソッドを配置できます
最後の手段として使用してください。
また、Magentoでは、翻訳上の理由から各モジュールのヘルパーが必要です。各モジュールで
呼び出されるヘルパーを作成し、Data.php
空のままにすることができます。
質問には2つの側面があります。
一般的には、名前のクラスを持つHelper
、Util
または類似することは、単に「私はどこに置くかわからないことを私はいくつかの機能を持っている」とクラスとしてあまり意味がありませんと言います。
Magentoは、ヘルパーをシングルトンとしてインスタンス化し、ほとんどのコアヘルパーには状態がありません。そのため、メソッドはクラスがあるstatic
場合とない場合もありfunctions
ます。これらのすべては、多くの場合、コードのにおい、アプリケーション設計の欠陥と見なされます。
マリウスがすでに指摘したように、独自のコードにヘルパーを使用する必要はありません。モジュール固有の翻訳を使用する場合は、モジュールごとにデフォルトの空のヘルパーを作成するだけです。そうしないと機能しません。モデル(Mage_Core_Model_Abstract
データベースデータを表さない場合は拡張する必要がない)または独立したライブラリクラスを優先します。
ただし、「ヘルパーをまったく使用しない」ことについてあまり厳密ではなく、代わりに次のようなクエリショートカットに使用します。
アクセスモジュールの構成:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
ライブラリクラスのファクトリメソッド
public function getNewFooService()
{
return new \Foo\Service(...);
}
他の場所を見つけることもできますが、モジュールヘルパーは私見です。 ようなことには十分です。
消費コアヘルパーは、あなたはかなり頻繁に行いますものです。
__()
翻訳方法:特定のモジュールの翻訳を取得するには、を使用する必要がありますMage::helper('module-alias')->__('string to be translated')
。これは$this->__(...)
、テンプレートまたはブロック内で使用する場合、およびtranslate="..."
、XMLファイルで属性ます。Mage::helper('core')
メソッド:ローカライズされた日付、価格、通貨のフォーマット、データのエスケープ、エンコードMage::helper('tax')
税構成から情報を取得し、それに基づいて価格を計算する方法Mage::helper('catalog/image')
キャッシュおよびサイズ変更されたカタログ画像を作成し、それらのURLを取得するためのインターフェースを提供しますMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
URL書き換えテーブルを製品コレクションクエリに結合します。コアヘルパーには多くの(多かれ少なかれ)有用な関数が隠されています。コアでどこかで使用される可能性のある特定の機能が必要な場合は、ヘルパーメソッドを再利用できるかどうかを確認してください。
通常これらのヘルパーはステートレスオブジェクトであり、メソッドはクエリメソッドです(つまり、副作用はありません)
しかし、いつものように、Magentoは独自の書かれていない規則を破り、例として取り上げるべきではありません。ヘルパーを使用しない「良い」例Mage_Catalog_Helper_Product_Compare
は、$_itemCollection
一度だけ初期化できるプロパティを持ち、$_customerId
できるプロパティと、セッターで変更できるプロパティがあります。コレクションが添付されたカタログに関連するヘルパーがさらにいくつか見つかります。それらを使用したり、異なるコンテキストで再利用したりするコードのテストを書くのは面白くないので、自宅ではしないでください。
上記のcatalog/image
ヘルパーは、ヘルパーであってはならないヘルパーの別の例です。init()
現在の状態をリセットする製品を最初に渡す必要があります。その後、さまざまなパラメーター(resize()
、などsetQuality()
)を設定し、最終的に__toString()
メソッドでURLを取得できます。テンプレートで使用する場合は見栄えがよくなりますが、コードは非常に複雑で、シングルトンとしては意味がありません。
TL; DR:
Reader
、Writer
モデルであり、実際には状態(少なくともファイルリソース)を持っています。たとえば、CSVファイルから注文ステータスデータを読み取る場合、sthがあります。リカOrderStatusCsvReader
で使用されているモデルOrderStatusUpdater
のモデル。私も心配「ファイルからデータを読み込む」と「Magentoので更新順序」分離こう
マリウスは正しい。ヘルパーはナンセンスだと思います。
しかし、magentoの理論では、オブジェクトの状態を変更しないヘルパーにすべてを入れる必要があります。たとえば、フォーマットされた価格を取得します。
しかし、ヘルパーに入れることのできるものはすべて、モデルにも入れることができます。また、モデルのさまざまなインスタンスを取得できるため、テストに役立ちます。
ヘルプは、モデル、テンプレートなどのコードの重複を防ぐのに役立ち、いつでも必要な場合に役立ちます。
Mage::getStoreConfigFlag('my/module/enabled')
ますが、これを確認したいすべてのファイルに、またはあなたが使用してMage::helper('my_module')->isEnabled()
の利点と:
isEnabled()
メソッドを書き換えることができ、いくつかのファイルを書き換える代わりに、それを使用するすべてのクラスに影響しますMage_Catalog_Model_Product
メソッドを追加するためにオーバーライドしgetProductArticles()
ます。そうです。ヘルパーに追加しますgetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Data.php
各モジュールで呼び出されるヘルパーを作成し、空のままにすることができます。
PHPUnitを使用する場合、次の1行を追加する必要があります。protected $_moduleName = 'My_Module';
foreach
ループやあらゆる種類の狂気の中でコレクションをロードしていた教育的なレガシーコードに取り組んできました。この恐ろしいロジックをヘルパーにリファクタリングし、オブジェクトキャッシュとして使用すると便利であることがわかりました。モデルに配置した場合ではgetModel
なく、誤って呼び出す可能性のある将来の開発者からのエラーの余地がほとんどありませんでしたgetSingleton
。