Magento 2 CMSページのgetList()リポジトリメソッドが期待されるオブジェクトを返さない


10

すべてのCMSページを削除する必要があります。

これがコードです:

名前空間Soon \ 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、
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     *既存のCMSページをすべて削除します
     * /
    パブリック関数cleanCmsPages()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList($ this-> searchCriteria)
            -> getItems();

        foreach($ cmsPageCollection as $ cmsPage){
            $ this-> cmsPageRepository-> delete($ 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、
                'Magento \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ searchResults-> setItems($ pages);

私が正しければ、このコードは配列を作成する配列を作成します$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. @agentクラスに適切なコメントを与えないか、またはインターフェイスを必要に応じて実装しないMagento。

この分析はCMSページAPIに関するものですが、CMS ブロック APIにも適用されます。


1
バグのように見え、最近誰かが報告しました:github.com/magento/magento2/issues/7140
Wojtek 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.