現在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);
私たちは、フィルタを適用したい場合は、私たちはの組み合わせを使用しSearchCriteriaBuilder
、FilterGroupBuilder
、FilterBuilder
とSortOrderBuilder
:
$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」とは何ですか?または、私はここで完全に間違った道を進んでいますか?