Magento 2 DIのベストプラクティス


19

たとえば、Magento 2拡張機能を構築しているとしましょう。それは非常に素晴らしいものを行うとしましょう。
しかし、他の開発者が拡張できるように、これが適切な標準を使用してビルドされることを確認したいと思います。

インターフェイスと組み合わせてDIを使用する必要がある場合と使用しない場合
ここでそれを明確にするのがコア例です。

クラスにMagento\Core\Helper\Dataは、次のようなコンストラクターがあります。

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

私の質問はvarに焦点を合わせています\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(同じコンストラクターに他のものがあることは知っていますが、私が考えるすべてのケースに1つの説明が当てはまります)。

di.xmlコアモジュールによると、varは次のインスタンスになりますMagento\Framework\App\Config

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

必要に応じて簡単に変更できます。

コードでそのようなインターフェイスを使用する必要があるのはいつですか?
私はこの不完全なサンプルモジュールを作成しました(広告は申し訳ありません)。そのようなインターフェイスを使用しましたが、それらはすべてコアからのものです。私は自分のものを作成していません。したほうがいい?


「それは非常に素晴らしいものを行うとしましょう。」StackExchangeでオンラインになっている人々の頭が浮いていますか?私がそれをインストールする原因です;)
デビッドマナー14

1
@DavidManners 1.xのすべての拡張機能を2.0に移植して、移植されるようにします。フローティング部分については知りませんが、何ができるかはわかります。
マリウス

これはMage2固有の質問ではなく、より一般的には「インターフェイスを使用するタイミング」です。それは、誰かが拡張機能を拡張できるようにする場所に依存します。ビジネスロジックを使用して作業するすべての場所で、変更される可能性があると言えます。;)振る舞いのないオブジェクト(単純なデータオブジェクトなど)は通常、変更されません。
トバイアス14

1
@TobiasZander、あなたは私がほとんどすべてのためのインターフェースを作成しなければならないと言うつもりですか?くそーそれは多くの仕事です。
マリウス

@ Marius、100%柔軟にしたいなら、なんとなくはい。しかし、私はそれを過剰に設計しません。個人的にはodetocode.com/blogs/scott/archive/2009/06/08 / ...が実際に役立つときの紹介として
Tobias 14

回答:


9

これはMage2固有の質問ではなく、より一般的には「インターフェイスを使用するタイミング」です。それは、誰かがあなたの拡張機能を拡張できるようにする場所に依存します。ビジネスロジックを使用して作業するすべての場所で、変更される可能性があると言えます。;)振る舞いのないオブジェクト(単純なデータオブジェクトなど)は通常、変更されません。

100%柔軟にしたい場合は、どこかでインターフェースを使用する必要があります。しかし、私はそれを過剰に設計しません。個人的には、http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspxが実際に役立つ場合の紹介としても気に入っています。


7

Magento2は、SOLID原則の使用を促進します。

依存関係反転の原理は、コードは抽象化(インターフェイス)に依存する必要があると直接述べています。

インターフェイス分離の原則は、多くのクライアント固有のインターフェイスが1つの汎用インターフェイスよりも優れていると述べています。クラスは保護されたインターフェイスを定義することもできるため、アーキテクチャの観点からはインターフェイスがより優先されます。

また、PHPはクラスの複数の継承をサポートしていませんが、インターフェイスの複数の実装をサポートしています。これがインターフェースのもう1つのポイントです。

そのため、単純なルールを使用できます使用するものがわからない場合は、常にinterfacesを使用します

PS。パフォーマンスインターフェイスを使用しない理由ではありません


インターフェースの使用が何らかの形でパフォーマンスに影響するかどうか興味がありますか?
amitshree

1
自動ロード機能の呼び出しは無料ではありません。例を参照してください:(dl.dropboxusercontent.com/u/3103646/…
-KAndy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.