コレクションの履歴はMagento 2にありますか?


25

現在Magento 2(2.1.2)にある多くのコードは、Magento 1から多かれ少なかれ移植されており、将来、多くのコードが同等のものに置き換えられることを知っています。この点で、Magento 2のコレクションの未来はどうなっているのでしょうか。

説明させてください:

Magento 1:

Magento 1では、次のようなコレクションを取得するために使用されます。

$products = Mage::getModel('catalog/product')->getCollection();

その後、フィルターやその他の操作をコレクションに適用できます。

$products->addAttributeToFilter('price', ['gteq' => 10]);
$products->addFieldToFilter('created_at', ['lt' => '2016-10-10']);
$products->setPageSize(10);
// ... etc ...

そして最後になりましたが、コレクションはモデルを返します。

foreach ($products as $product) {
    echo get_class($product); // Mage_Catalog_Model_Product
}

Magento 2:

Magentoは抽象化の多くの新しいレイヤーを追加し、より強固な作業方法を実装します。つまり、エンティティのリストが必要な場合は、リポジトリから要求します。

$productResults = $this->productRepository->getList($searchCriteria);

私たちは、フィルタを適用したい場合は、私たちはの組み合わせを使用しSearchCriteriaBuilderFilterGroupBuilderFilterBuilderSortOrderBuilder

$this->searchCriteriaBuilder->addSortOrder(
    $this->sortOrderBuilder
        ->setField('created_at')
        ->setAscendingDirection()
        ->create()
);
$priceFilter = $this->filterBuilder
    ->setField('price')
    ->setValue(10)
    ->setConditionType('gteq')
    ->create();
$createdAtFilter = $this->filterBuilder
    ->setField('created_at')
    ->setValue('2016-10-10')
    ->setConditionType('lt')
    ->create();
$filterGroups = [
    $this->filterGroupBuilder->addFilter($priceFilter)->create(),
    $this->filterGroupBuilder->addFilter($createdAtFilter)->create()
];

結果を反復処理する場合は、実際の(継承された)モデルではなく、データモデルを取得します。

foreach ($productResults->getItems() as $product) {
    echo get_class($product); // \Magento\Catalog\Model\Data\Product
}

この種の抽象化は、SOLID原則に従っており、「継承に対する構成」の原則を採用しています。そうでなければコレクションで行われる「エキゾチックな」操作(例:結合など)はリポジトリ内で内部的に行われるため、モジュールの外部での使用も容易になります。

質問:

このすべてが私を不思議に思います:リポジトリ/データモデルのアプローチ全体で、Magento 2の将来のコレクションの余地はありますか?コレクションは、モジュール自体によってのみ使用され、モジュールの外部では使用されませんか?または、Entity Managerを支持して廃止される予定ですか?

現在、データモデルを採用する場合は\Magento\Framework\Model\AbstractModel、コレクションを機能させるために、継承モデル(から継承)を作成するMagento\Framework\Data\Collection::setItemObjectClass必要があります(モデルをから拡張する必要があるためMagento\Framework\DataObject)。そして、リポジトリでフィルタリングできるように収集する必要があります。しかし、再び、リポジトリで(通常の)モデルをデータモデルに「変換」する必要があります。

または、getList()がのインスタンスを返すOrder Repositoryのように実装する必要がありますがMagento\Sales\Api\Data\OrderSearchResultInterface、水中では、検索結果はこのインターフェイスを実装する通常のコレクションにすぎません。楽しい事実:検索結果には、データモデルの配列(Magento\Sales\Api\Data\OrderInterface[])が返されますgetItems()が、コードを分析するMagento\Framework\Data\Collection::getItems()と、データモデルではなく順序モデル(で設定されたMagento\Sales\Model\ResourceModel\Order\Collection::_construct())が返されます。「継承に対する構成」についてはこれで終わりです。

Magento 2の適切な方法に関する多くの質問。繰り返しますが、同じことを行う方法は100ありますが、「The Magento Way」とは何ですか?または、私はここで完全に間違った道を進んでいますか?


2
ここで実際の質問をする+1。私はここで核心的な開発者の答えが本当に大好きです
マリウス

コレクションは段階的に廃止される予定だと思います。ただし、気づいたように、これは達成に近いものではなく、リファクタリングのさまざまな状態にあると思われる領域がたくさんあります(Magento \ Sales \ Api \ Data \ OrderSearchResultInterfaceとして安定したAPIがあるため、Magentoはフードの下でより簡単に起こります)。getListのさまざまな実装が、コレクションで現在できることほどの能力をまだ持っていないことは役に立ちません。返品に関して指摘した矛盾は、githubの問題に値する可能性があります。
クリストフ、フーマンで

回答:


16

コレクションは非推奨ではなくなりました。一部のモジュールはすでにサービスコントラクトAPIを公開していますが、他のモジュールはモデル/コレクションAPIのみを公開しています。

計画は次のとおりです。

  1. より良い@apiカバレッジで現在の状態を反映する:@apiを使用して、一部のモジュールの抽象コレクションと特定のコレクションに注釈を付けます
  2. 継承フレームワークを改善して、継承ベースのAPI(コレクション、モデル、リソースモデル)に依存せずにサービスコントラクトを簡単に作成できるようにします
  3. サービスコントラクトのコレクションベースの実装を促進しないために、抽象コレクションを廃止する
  4. サービスコントラクトAPIを使用して、モジュールの新しいバージョンを徐々にリリースします

そのため、コレクションはある時点で非推奨になりますが、現在はMagento 2 APIの1つです。

サービス契約の実装に関しては、-モデルとコレクションは、Magento <= 2.1で実装する唯一の便利な方法です。サービス契約は単なるインターフェースです。それらの実装はパブリックAPIの一部ではなく、後で変更される可能性があります。


1
ご回答有難うございます。では、新しいモジュールを作成する開発者へのアドバイスは何ですか?私の現在の戦略は、(水中で)コレクションを使用するサービスコントラクトを作成することです。これは、a)フィルタリングが容易になり、b)エンティティマネージャーがまだ実験的で文書化されていないためです。ある時点で、内部の仕組みを他のものに置き換えることができますが、インターフェースは同じままです。しかし、私があなたの答えを正しく理解していれば、それは今のところ正しい方法ですか?
ゲルバーカーズ

正しい。これを反映するように回答を編集しました。
アントンクリル

1
上記を考慮して、サービス契約を通じて取得できないデータを必要とする機能を実装する適切な方法は何でしょうか?たとえば、モジュールAが支払い方法でフィルタリングされたすべての注文を必要とする場合。
ステパン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.