Metode repositori Magento 2 get get Page () tidak mengembalikan objek yang diharapkan


10

Saya perlu menghapus semua halaman CMS.

Ini kodenya:

namespace Soon \ Core \ Setup;

gunakan Magento \ Cms \ Api \ PageRepositoryInterface;
gunakan Magento \ Framework \ Api \ SearchCriteriaInterface;

kelas Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    private $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    private $ cmsPageRepository;

    / **
     * Cms constructor.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    fungsi publik __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Hapus semua halaman CMS yang ada
     * /
    fungsi publik cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection sebagai $ cmsPage) {
            $ this-> cmsPageRepository-> delete ($ cmsPage);
        }
    }
}

Jadi, panggilan \Soon\Core\Setup\Cms::cleanCmsPagesharus menghapus semua halaman CMS.

Tetapi ketika melakukannya, saya mendapatkan kesalahan ini:

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

Jadi saya membuang yang $cmsPagedigunakan di saya foreach ($cmsPageCollection as $cmsPage)dan tampaknya, memang, $cmsPageadalah array.

Saya menggali ke dalam kode:

\Magento\Cms\Api\PageRepositoryInterface::getListdiimplementasikan oleh \Magento\Cms\Model\PageRepository::getList.

Kemudian \Magento\Cms\Model\PageRepository::getList, kita bisa melihat sedikit kode ini:

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ pageData,
                'Magento \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ searchResults-> setItems ($ pages);

Jika saya benar, kode ini membuat array yang mengisi $pagesarray. Jadi kode ini dapat menjelaskan mengapa $cmsPagesebuah array!

TAPI...

Dengan membaca @returnpernyataan \Magento\Cms\Api\PageRepositoryInterface::getList, kita bisa melihat @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

Dan, kemudian dengan membaca @returnpernyataan dari \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, kita bisa melihat \Magento\Cms\Api\Data\PageInterface[]!

Jadi $cmsPagedalam foreachloop saya harus merupakan implementasi \Magento\Cms\Api\Data\PageInterfaceyang kemudian dapat diteruskan dengan benar \Magento\Cms\Api\PageRepositoryInterface::delete.

Siapa yang salah

  1. Saya yang tidak bisa membaca / memahami komentar dan kode @api dengan benar
  2. Magento yang entah tidak memberikan komentar yang tepat di kelas @api mereka ... atau tidak mengimplementasikan antarmuka sebagaimana mestinya.

Analisis ini untuk API Halaman CMS tetapi juga berlaku untuk API Blok CMS .


1
Sepertinya bug, seseorang melaporkannya baru-baru ini: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Jawaban:


2

Anda dapat membuat masalah bug di github jika mau. Tetapi cara yang lebih cepat bagi Anda adalah menggunakan model sumber daya atau jika Anda ingin menggunakan metode repositori ini deleteById () di mana Anda dapat melewatkan id entitas.

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

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

Repositori bukan untuk operasi massal, ini mempengaruhi kinerja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.