Magentoのヘルパーとは何ですか?


22

Magentoのヘルパーとは何ですか?

どのような場合にヘルパーを使用する必要がありますか?

回答:


28

理論的には、決してヘルパーを使用しないでください。
ヘルパーは無関係なメソッドのコレクションであり、常にシングルトンとしてインスタンス化されます。
これは基本的に、いくつかの名前空間(この場合はクラス名)の下に関数をグループ化した手続き型プログラミングです。ただし、Magentoにはコアにヘルパーが含まれているため、メソッドを配置する場所がわからない場合や、さまざまな場所(モデル、コントローラー、テンプレート)で呼び出す必要がある場合にメソッドを配置できます

最後の手段として使用してください。

また、Magentoでは、翻訳上の理由から各モジュールのヘルパーが必要です。各モジュールで
呼び出されるヘルパーを作成し、Data.php空のままにすることができます。


私がヘルパーのために見つけた唯一の本当の「使用」は、彼らが常にシングルトンであることが保証されているということです。私は、foreachループやあらゆる種類の狂気の中でコレクションをロードしていた教育的なレガシーコードに取り組んできました。この恐ろしいロジックをヘルパーにリファクタリングし、オブジェクトキャッシュとして使用すると便利であることがわかりました。モデルに配置した場合ではgetModelなく、誤って呼び出す可能性のある将来の開発者からのエラーの余地がほとんどありませんでしたgetSingleton
ルークロジャース

@LukeRodgers。あなたの主張はわかりますが、「getSingletonの代わりに誤ってgetModelを呼び出した可能性がある」とは、ヘルパーを使用する本当の理由とは思えません。「偶然」「保存」の代わりに「削除」を呼び出すことができると主張できます。これを回避するためにどのような保護を行うことができますか?「注意を払う」ことはソフトウェア開発の一部だと思います。
マリウス

同意した。これらのシナリオでは、人類に対して防御的にコーディングしようとしているだけだと思います。
ルークロジャース

コアヘルパーにカスタムメソッドをどのように追加しますか?
tecjam

13

質問には2つの側面があります。

  1. 独自のヘルパーを作成する必要がありますか?
  2. コアヘルパーを使用する必要がありますか?

1.ヘルパーを書く

一般的には、名前のクラスを持つHelperUtilまたは類似することは、単に「私はどこに置くかわからないことを私はいくつかの機能を持っている」とクラスとしてあまり意味がありませんと言います。

Magentoは、ヘルパーをシングルトンとしてインスタンス化し、ほとんどのコアヘルパーには状態がありません。そのため、メソッドはクラスがあるstatic場合とない場合もありfunctionsます。これらのすべては、多くの場合、コードのにおい、アプリケーション設計の欠陥と見なされます。

マリウスがすでに指摘したように、独自のコードにヘルパーを使用する必要はありません。モジュール固有の翻訳を使用する場合は、モジュールごとにデフォルトの空のヘルパーを作成するだけです。そうしないと機能しません。モデル(Mage_Core_Model_Abstractデータベースデータを表さない場合は拡張する必要がない)または独立したライブラリクラスを優先します。

ただし、「ヘルパーをまったく使用しない」ことについてあまり厳密ではなく、代わりに次のようなクエリショートカットに使用します。

  • アクセスモジュールの構成:

    public function getFooBar() 
    {
        return Mage::getStoreConfig('module/foo/bar');
    }
  • ライブラリクラスのファクトリメソッド

    public function getNewFooService()
    {
        return new \Foo\Service(...);
    }

他の場所を見つけることもできますが、モジュールヘルパーは私見です。 ようなことには十分です。


2.ヘルパーを使用する

消費コアヘルパーは、あなたはかなり頻繁に行いますものです。

例:

  • __()翻訳方法:特定のモジュールの翻訳を取得するには、を使用する必要があります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:

  • コアヘルパーには便利なツールが含まれています。
  • 翻訳にはヘルパーが必要です
  • ヘルパーはステートレスでなければなりません
  • 独自のモジュールでは、さまざまな関数コレクションとしてヘルパーを使用しないでください。ほとんどの場合、より適切な場所を見つけることができます

フラットファイルに基づく単純なERP統合でよくヘルパーを使用しました。それらが行うことは、ローカルディレクトリからファイルを読み書きすることと、他のオブジェクト(製品、注文など)を更新することだけです。これらのインスタンスには、状態または対応する独自のテーブルはありません。これについてどう思いますか?
musicliftsme

1
これは「副作用なし」に違反します。ファイルの読み書きに関する私の普段の考え方はReaderWriterモデルであり、実際に状態(少なくともファイルリソース)を持っています。たとえば、CSVファイルから注文ステータスデータを読み取る場合、sthがあります。リカOrderStatusCsvReaderで使用されているモデルOrderStatusUpdaterのモデル。私も心配「ファイルからデータを読み込む」と「Magentoので更新順序」分離こう
ファビアンSchmengler

4

マリウスは正しい。ヘルパーはナンセンスだと思います。

しかし、magentoの理論では、オブジェクトの状態を変更しないヘルパーにすべてを入れる必要があります。たとえば、フォーマットされた価格を取得します。

しかし、ヘルパーに入れることのできるものはすべて、モデルにも入れることができます。また、モデルのさまざまなインスタンスを取得できるため、テストに役立ちます。


2

私はMagentoの初心者ですが、ヘルパーはMagentoのサービスに相当するものであるように見えます:「異なる目的のために再利用できる関連ソフトウェア機能のセット」。モジュールは、提供された機能をサービスを通じてエクスポートします。他のモジュールを使用するよう招待する関数のヘルパーを使用します。

モデルは、オブジェクトの状態の取得または設定に直接関連するメソッド、またはモデルのインスタンス化されたオブジェクトにリンクされるメソッドのみを提供する必要があります。


1

ヘルプは、モデル、テンプレートなどのコードの重複を防ぐのに役立ち、いつでも必要な場合に役立ちます。

  • カスタムモジュールが有効になっているかどうかをチェックするために、あなたは次のようなものを置くことができMage::getStoreConfigFlag('my/module/enabled')ますが、これを確認したいすべてのファイルに、またはあなたが使用してMage::helper('my_module')->isEnabled()の利点と:
    • つまり、何らかの理由で設定パスが変更された場合は、1つのファイルを調整するだけです
    • あなたはヘルパーisEnabled()メソッドを書き換えることができ、いくつかのファイルを書き換える代わりに、それを使用するすべてのクラスに影響します
  • 13日@カスタム拡張機能の書き方 必要でない限り、クラスを書き換えないでください。オブザーバーを使用し、オーバーライドするクラスのパラメーターおよびインスタンスとして受け取るヘルパーメソッドを使用できない場合。間違った: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';

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.