Magento 2 CMS 페이지 getList () 리포지토리 메서드가 예상 개체를 반환하지 않습니다


10

모든 CMS 페이지를 삭제해야합니다.

코드는 다음과 같습니다.

네임 스페이스 곧 \ Core \ Setup;

Magento \ Cms \ Api \ PageRepositoryInterface를 사용하십시오.
Magento \ Framework \ Api \ SearchCriteriaInterface를 사용하십시오.

Cms 클래스
{
    / **
     * @var SearchCriteriaInterface
     * /
    개인 $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    개인 $ cmsPageRepository;

    / **
     * Cms 생성자.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    공공 함수 __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepository 인터페이스 $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * 기존 CMS 페이지를 모두 삭제
     * /
    공용 함수 cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection을 $ cmsPage로) {
            $ this-> cmsPageRepository-> 삭제 ($ cmsPage);
        }
    }
}

따라서 호출 \Soon\Core\Setup\Cms::cleanCmsPages하면 모든 CMS 페이지가 삭제되어야합니다.

그러나 그렇게 할 때이 오류가 발생합니다.

Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given

그래서 나는 내에서 $cmsPage사용 된 것을 버리고 foreach ($cmsPageCollection as $cmsPage)실제로 $cmsPage배열 인 것처럼 보입니다 .

나는 코드를 파헤 쳤다.

\Magento\Cms\Api\PageRepositoryInterface::getList에 의해 구현됩니다 \Magento\Cms\Model\PageRepository::getList.

그러면에서 다음 \Magento\Cms\Model\PageRepository::getList과 같은 코드를 볼 수 있습니다.

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ pageData,
                '마 젠토 \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ searchResults-> setItems ($ 페이지);

내가 맞으면이 코드는 배열을 채우는 배열을 만듭니다 $pages. 따라서이 코드는 왜 $cmsPage배열 인지 설명 할 수 있습니다 !

그러나...

@return진술을 읽으면 \Magento\Cms\Api\PageRepositoryInterface::getList을 볼 수 있습니다 @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

그리고에서의 @return문장을 읽음으로써 \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems우리는 볼 수 있습니다 \Magento\Cms\Api\Data\PageInterface[]!

그렇게 $cmsPage내에서 foreach루프의 구현해야 \Magento\Cms\Api\Data\PageInterface다음에 제대로 전달 될 수있다 \Magento\Cms\Api\PageRepositoryInterface::delete.

누가 틀렸어?

  1. @api 주석과 코드를 제대로 읽고 이해할 수없는 저
  2. @api 클래스에 올바른 주석을 제공하지 않거나 인터페이스를 구현하지 않는 마 젠토.

이 분석은 CMS 페이지 API에 대한 것이지만 CMS 블록 API 에도 적용됩니다 .


1
: 그것은 사람이 최근에보고, 버그로 보이는 github.com/magento/magento2/issues/7140
보이 테크 Naruniec

답변:


2

원하는 경우 github에서 버그 문제를 만들 수 있습니다. 그러나 더 빠른 방법은 자원 모델을 사용하거나 엔티티의 ID를 전달할 수있는이 저장소 메소드 deleteById ()를 사용하려는 경우입니다.

vendor / magento / module-cms / Model / PageRepository.php

public function deleteById($pageId)
{
    return $this->delete($this->getById($pageId));
}

리포지토리는 대량 작업용이 아니며 성능에 영향을줍니다.

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