추상 모델에서 더 이상 사용되지 않는 저장 및로드 방법


57

나는 젠토 2 REPO의 개발 지점의 방법 볼 loadsave에서 Magento\Framework\Model\AbstractModel클래스가 사용되지 않습니다.
그러나이 클래스를 확장하고 사용하는 코어의 gazillion 클래스가 save하고 load.
엔터티의 CRUD 부분에 대한 자체 모듈을 만들 때 핵심 모듈과 동일한 지침을 따릅니다.
그러나 이러한 방법은 더 이상 사용되지 않으므로 미래에 대비할 수 있습니다.
그것들 대신에 무엇을 사용해야합니까? 아니면 다른 것을 확장해야합니까?


이 메소드는 현재 사용되지 않습니까?
기사 017

답변:


34

모듈 서비스 계약을 사용해야합니다.

예를 들어 제품의 경우 ProductRepositoryInterface 를 사용해야합니다.

<?php
/**
 *
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Catalog\Api;

/**
 * @api
 * @since 100.0.2
 */
interface ProductRepositoryInterface
{
    /**
     * Create product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @param bool $saveOptions
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\InputException
     * @throws \Magento\Framework\Exception\StateException
     * @throws \Magento\Framework\Exception\CouldNotSaveException
     */
    public function save(\Magento\Catalog\Api\Data\ProductInterface $product, $saveOptions = false);

    /**
     * Get info about product by product SKU
     *
     * @param string $sku
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function get($sku, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Get info about product by product id
     *
     * @param int $productId
     * @param bool $editMode
     * @param int|null $storeId
     * @param bool $forceReload
     * @return \Magento\Catalog\Api\Data\ProductInterface
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getById($productId, $editMode = false, $storeId = null, $forceReload = false);

    /**
     * Delete product
     *
     * @param \Magento\Catalog\Api\Data\ProductInterface $product
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\StateException
     */
    public function delete(\Magento\Catalog\Api\Data\ProductInterface $product);

    /**
     * @param string $sku
     * @return bool Will returned True if deleted
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     * @throws \Magento\Framework\Exception\StateException
     */
    public function deleteById($sku);

    /**
     * Get product list
     *
     * @param \Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
     * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface
     */
    public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria);
}

모듈 서비스 계약을 사용할 수없는 경우 ResourceModel을 사용하여 엔티티를 저장할 수 있습니다.


내가 참조. 이것은 말이됩니다. 그러나 모든 핵심 CRUD 모듈이 한 시점에서 서비스 계약을 체결한다는 것을 확인할 수 있습니까?
Marius

1
나는의 구현 볼 ProductRepositoryInterface여전히 사용하는 load방법에 getgetById. 이 load방법 대신 모듈에 대한 자원 모델을 사용해야 합니까?
Marius

2
예, 모듈 SL에서 ResourceModel을 사용하는 것이 더 좋습니다.
KAndy

6
ResourceModel 사용 방법에 대한 예제 코드를
제공해 주시겠습니까?

1
예가 있습니까? 공식 검토 및 뉴스 레터 모듈을보고 직접 "저장"이라고합니다. ResourceModel을 사용하는 예를 찾을 수 없습니다. 내 모듈에 대해 정의했지만 사용 방법은 무엇입니까?
Jānis Elmeris

24

내가 이해 무슨에서 무슨 일이 일어날 것은 젠토가와 hydrators로 전환하는 것입니다 extract()hydrate()방법.

이 링크는 작동하는 데 사용되었지만 Magento 팀이 롤백 한 것 같습니다 : https://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Model/Entity/EntityHydrator.php

https://github.com/magento/magento2/tree/09132da06e18dde0f90aabfc962db2bc19b64f3c/lib/internal/Magento/Framework/Model/Entity 여기서 커밋 기록을 찾을 수 있습니다.

중요한 파일은 다음과 같습니다.

  • EntityHydrator.php
  • EntityMetadata.php
  • HydratorInterface.php
  • MetadataPool.php

또한 Action폴더와 파일 아래의 파일을 확인하는 것이 좋습니다 Sequence.

내가 이해 한 것 (여기서는 완전히 틀릴 수 있습니다) :

  • Action폴더 아래의 파일은 CRUD 작업입니다.
  • Sequence파일은 반복자입니까?

그것은 전에 일어난 대화였습니다 (Alan Storm이 그것을 언급 했습니까? 기억할 수 없었습니다). 그래서 Magento 팀이 여전히 그런 식으로 가고 있는지 확실하지 않습니다.

최신 정보

내 연구 에서이 변경에 관한 내부 마 젠토 티켓은 MAGETWO-50676이며, 내가 찾은 관련 커밋은 다음과 같습니다.

TBH가 더 많을 수도 있지만 커밋 메시지를 보려면 전체 저장소를 탐색하고 싶지 않습니다 ^^

수화기에 익숙하지 않은 경우 링크를 확인하십시오. http://www.webconsults.eu/blog/entry/108-What_is_a_Hydrator_in_Zend_Framework_2

2.1에서 업데이트

Magento는 이제 EntityManager상속을 대체하기 위해 클래스를 사용하고 있습니다. 여기에서 자세한 정보를 찾을 수 있습니다. Magento 2.1 : 엔티티 관리자 사용


1
승인. 좋은 이론. 그러나 핵심의 예를 사용할 수 있습니다. 죄송하지만 magento 기술은 복사 / 붙여 넣기 / 대체로 다시 시작됩니다. :). 조치 및 순서 파일을 언급했습니다. 더 자세하게 얘기해 주 시겠어요?
Marius

@Marius 불행히도 그것은 내가 아는 전부입니다. 그 정보를 어디서 얻었는지 기억할 수 없지만 당시 계획은 github.com/magento/magento2/tree/… 이 특정 커밋을 사용하여 하이드 레이터 로의 전환을 구현하는 load()/save()것이 었습니다. 나는 Sequences반복자와 같은 작업을 가정 하고 ActionsCRUD 작업입니다
Digital Pianism의 Raphael

4
현재 cms 블록 자원 모델로드 방법에 예제가 있습니다. github.com/magento/magento2/blob/develop/app/code/Magento/Cms/… entityManager-> load github.com/magento/magento2/ blob / develop / lib / internal / Magento /… ReadMain 작업을 실행합니다 (생각합니다) github.com/magento/magento2/blob/develop/lib/internal/Magento/… 로드 된 엔티티 데이터로 스켈레톤 엔티티를 수화시킵니다 ( Magento에서 좋은 움직임;))
David Verholen


2

Magento 2 사용되지 않는로드 방법의 대안은 리소스 모델로드 방법입니다.

public funtion getCustomer($id)
{
   $customerModel = $this->customerFactory->create();
   $this->customerResource->load($customerModel, $id);
   $customerModel->getEmail();  
}

여기서 첫 번째 매개 변수는 모델 객체이고 두 번째 매개 변수는로드하려는 id입니다.

Magento 2 사용되지 않는 저장 방법의 대안은 리소스 모델 저장 방법입니다.

public funtion save($taskData)
{
   $taskModel = $this->taskFactory->create()->setData($taskData);
   $this->resource->save($taskModel);
}

save 메소드는 모델 오브젝트 인 하나의 매개 변수 만 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.