Magento 2:ヘルパーの適切な使用


9

テンプレートファイルで以下を使用できるようにするために、ヘルパークラスを宣言する人がますます増え始めています。

$this->helper('Path/To/Helper/Class')->customMethod();

この種のコードを使用すると、オブジェクトマネージャーを直接使用しないという制限を回避できますが、これらのヘルパーでブロックコードになるコードが表示される傾向があります。

だからここに私の質問があります:

  • ヘルパークラスに何を書けばよいですか?
  • テンプレートでヘルパーメソッドを使用するのはどの場合に適切ですか。

回答:


20

しないでください。
これはObjectManager::getInstance()->create()テンプレートで使用するようなものです!
代わりに、ヘルパーをコンストラクター依存関係として受け取るカスタムブロックを使用し、ヘルパーメソッドを呼び出すプロキシメソッドを追加します。

テンプレート:

$block->customMethod()

ブロック内:

public function __construct(Path/To/Helper/Class $helperClass, ...other dependencies...)
{
    $this->helper = $helperClass;
    // ...other assignments and call to parent::__construct()
}

public function customMethod()
{
    return $this->helper->customMethod();
}

OOPの原則では、これは「デメテルの法則」に違反することを避けます。テンプレートではなく、ブロックにビジネスロジックをカプセル化します。副作用として、ロジックがブロックに移動されるときにロジックをテストしやすくします。

ヘルパークラスにどのロジックを入れるかに関して、Magento 2のヘルパーは、モデルではなく、再利用可能なコード、たとえば価格フォーマット(コアに含まれていますが、今はもっと良い例を考えないでください)。


私は原則に同意しますがdi.xml、ブロッククラスタイプので設定を使用しているように見えますが、一部のレイアウト構成は保持されません。たとえば、クラス\Magento\Catalog\Block\Product\View\Type\Simpleでそれを実行しようとしましdefault.phtmlたが、テンプレートで使用されていたテンプレートは無視されます。現時点では何の手がかりもない
シルヴァン・ライエ2017年

2
最新情報については、こちらをご覧ください。2.2以降、Blockクラスを拡張することは推奨されていません。代わりに、カスタムプレゼンテーションロジックが必要な場合は、ViewModelを定義し、layout.xmlのブロックの引数として宣言する必要があります。viewmodelsは、オブジェクトマネージャを経由して構築されているので、あなたは、Magentoの2の将来のリリースで変更を壊すBCに自分をさらすことなく、独自の依存関係グラフを配線することができます
ジョン・ホール

1

私はヘルパーをモジュール内のグローバル関数(「グローバル」という言葉で申し訳ありません)と見なし、マネージャー/サービスコントラクトをモジュール内外で使用できるグローバル関数と見なしています。

この原則に従うと、ヘルパーの使用は最小限に抑えられます。私はモジュールの構成ラッパーとしてのみ使用しています。

$this->configHelper->get(Config::PATH_TO_XML_PATH);
$this->configHelper->isEnabled();

この種のもの。モジュール外で実用的な機能が他にある場合は、代わりにマネージャーを作成してください。

理想的な世界では、他のモジュールの機能を必要とするサードパーティの開発者は、リポジトリとマネージャの利用可能なインターフェースと- Apiフォルダ内のものを調べればよいだけです。

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