Magento 2ヘルパーインスタンス
-
11-12-2019 - |
質問
私はMagento 2からDIシステムの周りに頭を包んだと思うとき、何かが起きて包まれています。
私はコアコードでヘルパーにアクセスするためのさまざまな方法を見ます。
例えばMagento\Catalog\Controller\Category::_initCategory
ではこれがあります:
if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
return false;
}
.
しかしMagento\Catalog\Block\Category\View
では、ヘルパーはint He Constraintor に注入されます。
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Catalog\Model\Layer\Category $catalogLayer,
\Magento\Framework\Registry $registry,
\Magento\Catalog\Helper\Category $categoryHelper,
array $data = array()
) {
$this->_categoryHelper = $categoryHelper;
$this->_catalogLayer = $catalogLayer;
$this->_coreRegistry = $registry;
parent::__construct($context, $data);
}
.
これは、ヘルパーがコントローラとブロック(およびモデル)で異なる方法でアクセスされるべきであると考えることを私につながりますが、サーバーがコンストラクタMagento\Catalog\Controller\Adminhtml\Product\Action\Attribute
に注入されるコントローラを見つけました。
私のために霧をきれいにしてください。
いつdiを使うべきですか、いつobjectManager
を使うべきですか?なぜ?
この質問を読んでいます: Magento 2 のヘルパーのインスタンス化これはそれに関するフォローアップの質問です。
解決
私は可能な限りdiを好むでしょう、オブジェクトマネージャを使うことはすでにdemeterの法則に対する違反です。オブジェクトマネージャを使用する場合、これらの依存関係はメソッドロジックに隠されています。
他のヒント
Magentoの実装についてはあまり知りませんが、ObjectManager
はサービスロケーター
一般的にオブジェクト内の依存関係にアクセスするためのサービスロケータを使用することはかなり悪いです、チェックアウトこの記事
コンストラクターを通して依存関係を明示的に定義することははるかに良いアプローチです。それは、サービスが定義されていないサービスに関する単体テストと実行時間の問題に対処しています。
オブジェクトマネージャをクラスに注入することは、基本的にすべてのアプリケーションサービスにアクセスできるクラスにレジストリを注入しています。これは明らかに正しいものではありません。
zf2 公正なビットで、一般的にサービス、コントローラ、および任意のクラスのための小型ファクトリークラスを定義します。依存関係が必要です。これらのファクトリクラスはサービスロケータにアクセスして、オブジェクトが依存するすべてのサービスをグラブし、それらをコンストラクターを介して注入します。ファクトリークラスのサービスロケータを使用することは、ほとんどの場合、この。
ヘルパーを使用するための唯一の方法は次のとおりです。
$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();
.
私はあなたがまだ知らなかったならば役に立つことを願っています。
古い質問ですが、 marius の答えがわかりません。私は marius がそれに答えることができます。短く答えたいと思います。 なぜMagento 2はヘルパーの代わりにDIを使用することをお勧めしますか?
- ユニットテストを隔離する/簡単
- クラスの依存関係を明示的に定義する
- 良いデザインを促進する(単一責任原則(SRP)) 例)
- あなたのモジュールのDIを使うと、互換性のあるバグの危険性が減少します。
Magentoはそれらのインタフェースの基礎となる実装を変更します。
これは、拡張開発者を理解するための重要な概念です。
なぜM2のコアがDIが使われていないのか?
- クラス数の減少
- 不要なインターフェイスの作成
- 互換性のあるバグの危険性はありません
コアカタログモジュールはヘルパーで使用されていますが、それは広く使いました。私の研究では、Magento 2は、サービス契約に適していないコアカタログヘルパーファイルの中心的な機能を使用しました。
マゼント定義のクラス(\ Magento \ Catalog \ Model \ Productなど)を明示的に使用しなければならない場合は、サービス契約インタフェースの代わりに具体的な実装に応じて暗黙の依存関係を明示的にしてください。
間違いなく、拡張開発者はMagento1の代わりにMagento1の代わりにDIを使用する必要があります。 Magento 2のガイドラインに従って実装するとき、フォールアウトは制限されています。推奨事項を破るとき、問題が発生します。