Các phương thức kho lưu trữ Magento 2 CMS Trang getList () không trả về đối tượng mong đợi


10

Tôi cần xóa tất cả các trang CMS.

Đây là mã:

không gian tên Soon \ Core \ Setup;

sử dụng Magento \ Cms \ Api \ PageRep repositoryInterface;
sử dụng Magento \ Framework \ Api \ SearchCriteriaInterface;

lớp Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    riêng tư $ searchCriteria;
    / **
     * @var PageRep repositoryInterface
     * /
    riêng tư $ cmsPageRep repository;

    / **
     * Cms xây dựng.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRep repositoryInterface $ cmsPageRep repository
     * /
    chức năng công cộng __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRep repositoryInterface $ cmsPageRep repository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRep repository = $ cmsPageRep repository;
    }

    / **
     * Xóa tất cả các trang CMS hiện có
     * /
    chức năng công cộng CleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRep repository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection là $ cmsPage) {
            $ this-> cmsPageRep repository-> xóa ($ cmsPage);
        }
    }
}

Vì vậy, gọi \Soon\Core\Setup\Cms::cleanCmsPagesnên xóa tất cả các trang CMS.

Nhưng khi làm như vậy, tôi gặp lỗi này:

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

Vì vậy, tôi đã bỏ đi cái $cmsPageđược sử dụng trong tôi foreach ($cmsPageCollection as $cmsPage)và có vẻ như, thực sự, $cmsPagelà một mảng.

Tôi đào sâu vào mã:

\Magento\Cms\Api\PageRepositoryInterface::getListđược thực hiện bởi \Magento\Cms\Model\PageRepository::getList.

Sau đó \Magento\Cms\Model\PageRepository::getList, chúng ta có thể thấy đoạn mã này:

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

Nếu tôi đúng, mã này tạo ra một mảng cư trú trong $pagesmảng. Vì vậy, mã này có thể giải thích tại sao $cmsPagelà một mảng!

NHƯNG...

Bằng cách đọc @returntuyên bố của \Magento\Cms\Api\PageRepositoryInterface::getList, chúng ta có thể thấy @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

Và, sau đó bằng cách đọc @returntuyên bố từ \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, chúng ta có thể thấy \Magento\Cms\Api\Data\PageInterface[]!

Vì vậy, $cmsPagetrong foreachvòng lặp của tôi nên là một triển khai \Magento\Cms\Api\Data\PageInterfacemà sau đó có thể được chuyển đúng \Magento\Cms\Api\PageRepositoryInterface::delete.

Ai sai

  1. Tôi là người không thể đọc / hiểu bình luận @api và mã đúng
  2. Magento, người không đưa ra nhận xét đúng trong các lớp @api của họ ... hoặc không thực hiện giao diện như bình thường.

Phân tích này dành cho API trang CMS nhưng cũng áp dụng cho API khối CMS .


1
Có vẻ như là lỗi, ai đó đã báo cáo gần đây: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Câu trả lời:


2

Bạn có thể tạo vấn đề lỗi trên github nếu bạn muốn. Nhưng cách nhanh hơn cho bạn là sử dụng mô hình tài nguyên hoặc nếu bạn muốn sử dụng phương thức kho lưu trữ này xóaById () nơi bạn có thể truyền id của thực thể.

nhà cung cấp / magento / module-cms / Model / PageRep repository.php

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

Các kho lưu trữ không dành cho hoạt động hàng loạt, điều này ảnh hưởng đến hiệu suất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.