私は Magento を理解しようとしていますが、このトピックについて誰かが私に洞察を与えることができるかどうか疑問に思っていました
モデル、リソース モデル、およびコレクションの基本概念と、それらの相互関係について説明する
私は Magento を理解しようとしていますが、このトピックについて誰かが私に洞察を与えることができるかどうか疑問に思っていました
モデル、リソース モデル、およびコレクションの基本概念と、それらの相互関係について説明する
リソース モデルは、データストアからデータをフェッチするコードを含むオブジェクトです。実際には、これは、リソース モデルが、SQL のビルドおよびフェッチ コードを含むオブジェクトであり、メインの Magento データベースに接続するオブジェクトへの参照であることを意味します。
モデルは、データの「タイプ」と対話するためのデータベースに依存しないコードを含むオブジェクトです。従来のデータ モデリング用語では、モデル オブジェクトには特定の種類のオブジェクト (製品、顧客などを意味するオブジェクトの種類) のビジネス ロジックが含まれています。
重要: 上記の定義に加えて、Magento コードの一部は、データに関係のないビジネス ロジックを含む汎用オブジェクトとして「モデル」を使用します。これらの「モデル」は、Magento ファクトリ パターンによってインスタンス化された単純な古いオブジェクトと考える必要があります。から継承するモデルMage_Core_Model_Abstract
は前者であり、そうでないモデルは後者です。この投稿では、「モデル」は前者を指すと想定しています。また、これらを Magento のCRUD モデルと呼び始めました。
コレクションは、モデル オブジェクトのグループ (コレクション、配列、リストなど) をフェッチするコードを含むオブジェクトです。これを行うために SQL を生成するため、これもリソース モデルと見なされ、Mage::getResourceModel
メソッドでインスタンス化されます (ただし、コレクション オブジェクトは、通常のリソース モデルとは異なるクラスのチェーンから継承されます。これらは、探している設計パターンではありません)。コレクション オブジェクトは特定の標準 PHP インターフェイスも実装しており、foreach
ループ内で使用して結果を反復処理することができます。
Magento モデル オブジェクトには、データの読み込みに使用されるリソース モデルへの参照が含まれています。モデル オブジェクトごとに個別のリソース モデル オブジェクトがあります。つまり、製品モデルには製品リソース モデルがあります。
Magento モデル オブジェクトを使用して、コレクション オブジェクトをインスタンス化することもできます。コレクション オブジェクトも、そのモデル オブジェクトと一致するように型指定されます。Product モデルを使用して、Product コレクション オブジェクトをインスタンス化できます。
コレクション オブジェクトは、オブジェクトのグループ (コレクション、配列、リストなど) をフェッチするための SQL を作成します。また、データをメイン モデル オブジェクトに割り当てるためのコードも含まれます。このコードはモデルのリソース モデル オブジェクト内のコードとはわずかに異なるため、直接ロードされたモデルとコレクションを介してロードされたモデルの間にわずかな相違が生じることがよくあります。たとえば、コレクションは各モデルの_afterLoad
メソッドを呼び出さないか、EAV コレクションはデフォルトですべての属性データをロードしません (addAttributeToCollection('*')
が使用されない限り)。多くの Magento 開発では、これらの不一致を追跡して説明しています。
最後に、Magento のソース コードには、上記とは異なる場所があります。例: レポート コレクション オブジェクトは独立しており、特定のモデル クラスに関連付けられていません。上記を念頭に置いてください。ただし、特定の Magento モジュールがあなたを驚かせることに備えてください。
入力するには多すぎます :) Alan Storm は、magento モデルの基本について素晴らしい記事を書きました