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
- Saya yang tidak bisa membaca / memahami komentar dan kode @api dengan benar
- 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 .