Magento 2의 컬렉션 기록입니까?


25

현재 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 가지 방법이 있지만 '마 젠토 웨이'는 무엇입니까? 아니면 내가 완전히 잘못된 길을 가고 있습니까?


2
여기에 실제 질문을하세요 +1. 나는 여기서 핵심 개발자 답변을 정말로 좋아할 것입니다
Marius

컬렉션이 단계적으로 폐지 될 계획이라고 생각합니다. 그러나 이것이 달성되는 것에 거의 근접하지 않았고 리팩터링되는 다양한 상태에있는 것처럼 보이는 영역이 많이 있습니다 (Magento \ Sales \ Api \ Data \ OrderSearchResultInterface와 같은 안정적인 API를 사용하여 Magento가 나중에 후드에서 더 쉽게 발생합니다). getList의 다양한 구현이 현재 컬렉션으로 수행 할 수있는 것만 큼 아직 능력이 없다는 것을 도움이되지 않습니다. 명시된 반환에 대해 언급 한 불일치는 github의 문제에 적합 할 수 있습니다.
Kristof at Fooman

답변:


16

컬렉션은 더 이상 사용되지 않습니다. 일부 모듈은 이미 서비스 계약 API를 노출하지만 다른 모듈은 여전히 ​​모델 / 컬렉션 API 만 노출합니다.

계획은 다음과 같습니다

  1. @api 적용 범위를 개선하여 현재 상태 반영 : @api를 사용하여 일부 모듈에서 추상 컬렉션 및 특정 컬렉션에 주석을 추가합니다
  2. 상속 기반 API (컬렉션, 모델, 리소스 모델)에 의존하지 않고 서비스 계약을 쉽게 만들 수 있도록 지속성 프레임 워크 개선
  3. 서비스 계약의 콜렉션 기반 구현을 장려하지 않기 위해 추상 콜렉션을 사용하지 않습니다
  4. 서비스 계약 API를 사용하여 최신 버전의 모듈을 점진적으로 릴리스

따라서 컬렉션은 언젠가 더 이상 사용되지 않지만 이제는 Magento 2 API 중 하나입니다.

서비스 계약의 구현과 관련하여-모델 및 컬렉션은 Magento <= 2.1에서이를 구현할 수있는 유일한 편리한 방법입니다. 서비스 계약은 인터페이스 일뿐입니다. 구현은 공개 API의 일부가 아니며 나중에 변경 될 수 있습니다.


1
답변 주셔서 감사합니다. 새 모듈을 만드는 개발자에게는 어떤 조언이 있습니까? 현재의 전략은 a) 필터링이 쉬워지고 b) 엔티티 관리자가 여전히 실험적이거나 문서화되지 않았기 때문에 (수 중에서) 여전히 콜렉션을 사용하는 서비스 계약을 작성하는 것입니다. 어떤 시점에서 내부 작업은 다른 것으로 대체 될 수 있지만 인터페이스는 동일하게 유지됩니다. 그러나 귀하의 답변을 올바르게 이해하면 이것이 올바른 방법입니까?
Giel Berkers

옳은. 이것을 반영하기 위해 답변을 편집했습니다.
Anton Kril

1
위의 사항을 고려할 때 서비스 계약을 통해 가져올 수없는 데이터가 필요한 기능을 구현하는 적절한 방법은 무엇입니까? 예를 들어, 모듈 A가 모든 주문을 지불 방법으로 필터링해야하는 경우.
Stjepan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.