Magentoにはいくつのデザインパターンがありますか?


15

Magento 2にはいくつのデザインパターンがありますか?

回答:


37

Magento 1/2のデザインパターン

パート1:MVC

Magentoは、DOMベースの構成レイヤーを利用するユニークなMVCパターンを利用します。xmlを活用して、通常のModel-View-Controllerアーキテクチャ上でアプリケーションの構成とアクションを実行します。

パート2:フロントコントローラー

Magentoは、フロントコントローラーパターンを使用して、アプリケーションのワークフローを実装します。すべてのリクエストに対して単一のエントリポイント(index.php)があります。すべてがどのように機能するかを見てみましょう。

パート3:工場

Factoryメソッドは、Magentoでクラスをインスタンス化するために使用されます。クラスグループを表す抽象名とそれに続くクラス名を渡す適切なメソッドを呼び出して、Magentoでクラスをインスタンス化します。クラスグループとその適切な抽象化は、モジュールの/ etc /フォルダー内の構成XMLファイルで宣言されます。

パート4:シングルトン

ファクトリクラスの抽象化やMagentoのクラスグループと同様に、シングルトンパターンは、同じブロックとクラスに対してインスタンス化されます。

パート5:レジストリ

レジストリパターンは基本的に、使用するリソースのパブリックグローバルスコープでオブジェクトまたはデータを使用できるようにするパターンです。

パート6:プロトタイプ

MagentoのPrototypeパターンは、Abstract Factoryパターンの拡張として使用されます。オブジェクトに割り当てられた適切なタイプを介して、適切なサブクラスがインスタンス化されるようにします。これは何を意味するのでしょうか?基本的に、親タイプを介して定義された特定のクラスを取得する必要がある場合は常に、プロトタイプパターンにより、必要なものを処理できる適切なクラスを取得することができます。

パート7:オブジェクトプール

オブジェクトプールパターンは、オブジェクトを再インスタンス化し、終了後に破棄するのではなく、オブジェクトを繰り返し使用できる状態に保ちます。メモリ消費と計算サイクルを節約する素晴らしい方法です。

パート8:イテレーター

イテレータパターンは、オブジェクトが別のクラスの要素を通過できるようにするデザインパターンです。これにより、反復子を指定し、反復を許可する基礎となる構造を変更せずに、複数の異なるデータセットを渡すことができます。

パート9:遅延読み込み

遅延読み込みは、オブジェクトが呼び出されるまでオブジェクトの読み込みを遅らせる設計パターンです。Magentoでは、オブジェクトではなくデータでこれを利用します。

パート10:サービスロケーター

サービスロケーターは、抽象化レイヤー内にプロセスをカプセル化することにより、ユーザーがサービスを取得できるようにするデザインパターンです。これにより、ユーザーは実行時にそのサービスが何であるかを知らなくても、適切なサービスまたは最適なサービスを取得できます。

パート11:モジュール

モジュール設計パターンは、プログラムの機能を独立した交換可能なモジュールにグループ化することを強調するモジュール式プログラミングの形式です。

パート12:オブザーバー

オブザーバーパターンは、アプリケーションの実行中の特定のポイントでイベントリスナーが設定される場所です。アプリケーションの他のコンポーネントは、このイベントリスナーに「フック」して、この時点でコードを実行できます。

パート13:アクティブレコード

オブジェクトは、データベーステーブル内の行の表現です。これらのオブジェクトには、テーブルの構造を表す列を反映するプロパティと、データベース内でこれらのプロパティを変更できるメソッドが必要です。

Magentoによるパターンの使用

Mage_Core_Model_Abstractクラスの後に継承するクラスは、クラスが接続されているテーブル内のレコードのロード、変更、作成、削除を可能にするload()、save()およびdelete()メソッドにアクセスできます。さらに、Mage_Core_Model_AbstractクラスはVarien_Objectを継承します。これにより、特定のオブジェクトのプロパティを持つデータベーステーブルの列の自動マッピングを行う真に魔法のメソッド__set()および__get()にアクセスできます。

追加Magento 2

サービス契約設計パターン

Magentoは拡張ベースまたはモジュラーシステムであり、サードパーティの開発者がフレームワークの中核部分をカスタマイズして上書きできるようにします。これらのカスタマイズは、いくつかの問題につながる可能性があります。たとえば、開発者が外部拡張機能によって行われたカスタマイズを追跡するようになります。したがって、このMagentoを克服するために、サービス契約パターンを考え出します。サービスコントラクトは、エンドユーザーとビジネスレイヤーの間のレイヤーとして機能するインターフェイスのセットです。したがって、カスタマイズのためのビジネスロジックをエンドユーザーに直接公開するのではなく、サービスコントラクトと呼ばれる層が間にあります。

サービス契約は、Magentoのモジュール性を強化します。販売者がMagentoを簡単にアップグレードできるようにします。他の外部およびMagentoモジュールが実装する、明確で耐久性のあるAPIを保証します。RESTまたはSOAPインターフェイスを介してビジネスロジックを公開する簡単な方法を提供します。

オブジェクトマネージャー

-依存性注入、シングルトン、ファクトリー、抽象ファクトリー、コンポジット、戦略、CQRS、デコレーターなど、さまざまなパターンで構成されています。これらの中で最もよく使用されるパターンについて説明します。オブジェクトマネージャには非常に大きな役割があり、Magentoはオブジェクトの直接使用を禁止しています。オブジェクトマネージャは、ファクトリ、シングルトン、およびプロキシパターンの実装を担当します。クラスコンストラクターでパラメーターを自動的にインスタンス化します。futureを移動する前に、注入可能なオブジェクトと注入不可能なオブジェクトについて理解しましょう。

注入可能なオブジェクト

EventManager、CustomerAccountManagementServiceなどの独自のIDはありません。

注射不可能なオブジェクト

顧客、製品など。これらのエンティティには通常、アイデンティティと状態があります。アイデンティティがあるため、エンティティの正確なインスタンスを確認する必要があります。

依存性注入

magento 1のMageに代わるものです。依存オブジェクトを内部的に作成するのではなく、外部環境を通じて注入するという概念です。したがって、必要なときにリソースを作成するのではなく、オブジェクトを作成するときにリソースを要求します。これは将来の変更に役立ち、必要なオブジェクトをモックすることでテストが非常に簡単になります。

工場パターンまたは工場クラス:

Magento 2 Factoryクラスでは、オブジェクトマネージャーとビジネスコードの間にレイヤーを作成します。ファクトリクラスは自動生成されるため、明示的に定義する必要はありません。非注入オブジェクトのファクトリクラスを作成する必要があります。

プロキシパターン

プロキシクラスは、別のクラスの代わりに機能するために使用され、Magento 2では、リソースを消費するクラスの代わりに使用されることがあります。プロキシクラスの機能を理解するために、プロキシクラスの発生につながる理由を見てみましょう。Magentoはオブジェクトの作成にコンストラクターインジェクションを使用し、オブジェクトをインスタンス化すると、そのコンストラクターのすべてのクラスもインスタンス化されるため、コンストラクターを介してインスタンス化のチェーンにつながるため、プロセスが本当に遅くなり、アプリケーションのパフォーマンスに影響を与える可能性があります、したがって、チェーンのインスタンス化を停止するには、Magentoはプロキシクラスを使用します。

次のコードを見てみましょう:

Magento\Catalog\Model\Product\Attribute\Source\Status\Proxy

Magento\Catalog\Model\Product\Link\Proxy

したがって、上記のコードでは、catalogProductStatusおよびproductLinkにプロキシクラスを使用しています。走るとき

 php bin/magento setup:di:compile 

Magentoはdi.xmlを使用していくつかの固定規則でプロキシクラスをオンザフライで作成し、元のオブジェクトをプロキシクラスオブジェクトに置き換えます。プロキシクラスを見て、どのように機能するかを理解しましょう

プロキシの作成中に、Magentoの一般的な規則が続きます。

  • プロキシクラスの名前空間は元の名前空間(Magento \ Catalog \ Model \ Product \ Attribute \ Source \ Status)と同じになります
  • プロキシクラスは1つのオブジェクト、つまりオブジェクトマネージャのみを拡張します
  • 特定のアクションでのみ呼び出される__sleep、__ wakeなどのマジック関数と、__ cloneなどの関数は、元のクラスのオブジェクトを作成し、必要な場合にのみオブジェクトを提供します(遅延ロードデザインパターンを使用)。したがって、アプリケーションのパフォーマンス https://devdocs.magento.com/guides/v2.0/extension-dev-guide/proxies.html

プラグイン(インターセプター)

概要

プラグイン、またはインターセプターは、関数呼び出しをインターセプトし、その関数呼び出しの前後または前後にコードを実行することにより、パブリッククラス関数の動作を変更するクラスです。これにより、任意のクラスまたはインターフェイスの元のパブリックメソッドの動作を置換または拡張できます。

パブリックメソッドの動作をインターセプトおよび変更したい拡張機能は、プラグインと呼ばれるプラグインクラスを作成できます。

このインターセプトアプローチは、同じクラスまたはメソッドの動作を変更する拡張機能間の競合を減らします。プラグインクラスの実装はクラス関数の動作を変更しますが、クラス自体は変更しません。設定された並べ替え順序に従って順番に呼び出すことができるため、これらのインターセプターは互いに競合しません。

制限事項

プラグインは次のいずれでも使用できません。

  • 最終的な方法
  • 最終クラス
  • 非公開メソッド
  • 静的メソッド
  • __construct
  • 仮想タイプ
  • Magento \ Framework \ Interceptionがブートストラップされる前にインスタンス化されるオブジェクト
  • ObjectManagerによってインスタンス化されないオブジェクト(たとえば、newを直接使用して)。 https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html

ObjectManager

概要

Magentoアプリケーションなどの大規模なアプリケーションは、オブジェクトマネージャーを使用して、インスタンス化中にオブジェクトを作成する際の定型コードを回避します。

Magentoフレームワークでは、ObjectManagerInterfaceの実装がオブジェクトマネージャーの役​​割を果たします。

責任

オブジェクトマネージャには次の責任があります。

工場およびプロキシでのオブジェクト作成。要求時にクラスの同じ共有インスタンスを返すことにより、シングルトンパターンを実装します。コンストラクターがインターフェイスを要求したときに優先クラスをインスタンス化することによる依存関係管理。クラスコンストラクターでパラメーターを自動的にインスタンス化します。 https://devdocs.magento.com/guides/v2.0/extension-dev-guide/object-manager.html

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