현재 Magento 2 (2.1.2)에있는 많은 코드가 Magento 1에서 어느 정도 이식되었으며 앞으로 많은 코드가 동등한 코드로 대체 될 것입니다. 이 측면에서 Magento 2의 미래 컬렉션이 궁금합니다.
설명하겠습니다 :
마 젠토 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
}
마 젠토 2 :
Magento는 더 많은 SOLID 작업 방식을 구현하여 새로운 추상화 계층을 추가합니다. 즉, 엔티티 목록을 원할 때 저장소에서 요청합니다.
$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의 컬렉션을위한 공간이 있습니까? 컬렉션은 모듈 자체가 아닌 내부적으로 만 사용해야합니까? 아니면 엔터티 관리자에게 유리하게 사용되지 않습니까?
현재 데이터 모델을 수용하려는 경우 \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()
). '상속적인 구성'을 위해 너무 많은.
마 젠토 2의 올바른 방법에 대한 많은 질문들 : 다시 말하지만, 같은 일을하는 100 가지 방법이 있지만 '마 젠토 웨이'는 무엇입니까? 아니면 내가 완전히 잘못된 길을 가고 있습니까?