需要为Magento 2中的评论创建自定义REST API

时间:2018-08-30 09:55:58

标签: magento2

我需要在magento 2中创建一个REST API,以商店ID为参数,并返回特定商店ID的所有评论。

如果传递其他参数(例如客户ID,产品ID),则应执行过滤。

1 个答案:

答案 0 :(得分:2)

这是一个非常广泛的主题需要解释。我正在逐步解释程序。

步骤1.在Magento 2核心文件夹中,转到应用程序/代码。 创建供应商文件夹(如ECMAG)和子文件夹(如MyReviews)。 在MyReviews文件夹中,创建三个文件夹Api等并进行建模。

步骤2。在etc文件夹中,使用以下代码创建di.xml文件。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">

    <preference for="ECMAG\MyReviews\Api\MyReviewInterface"
                type="ECMAG\MyReviews\Model\MyReviewClass" />

</config>

接下来,在同一文件夹中创建module.xml文件。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="ECMAG_MyReviews" setup_version="1.0.0"/>
</config>

接下来,在同一文件夹中创建webapi.xml文件。

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd">
    <route url="/V1/showreview/allreviews/:storeId" method="GET">
        <service class="ECMAG\MyReviews\Api\MyReviewInterface" method="getAllReviews"/>
        <resources>
            <resource ref="anonymous"/>
        </resources>
    </route>

</routes>

第3步。接下来在Api文件夹中创建界面。

<?php
namespace ECMAG\MyReviews\Api;
interface MyReviewInterface
{

    /**
     * GET  review by its ID
     *
     * @api
     * @param string $storeId
     * @return array
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getAllReviews($storeId);

}

第4步。接下来在“模型”文件夹中创建类。

<?php
namespace ECMAG\MyReviews\Model;
use ECMAG\MyReviews\Api\MyReviewInterface;
use Magento\Framework\App\Bootstrap;    

class MyReviewClass implements MyReviewInterface{
    protected $request;
    public function __construct(\Magento\Framework\App\Request\Http $request) {
       $this->request = $request;
    }

     /**
     * GET  review by its ID
     *
     * @api
     * @param string $storeId
     * @return array
     * @throws \Magento\Framework\Exception\NoSuchEntityException
     */
    public function getAllReviews($storeId){
        $bootstrap = Bootstrap::create(BP, $_SERVER);
        $obj = $bootstrap->getObjectManager();
        $state = $obj->get('Magento\Framework\App\State');

        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $storeManager = $objectManager->get('Magento\Store\Model\StoreManagerInterface');
        $currentStoreId = $storeManager->getStore()->getId();
        $rating = $objectManager->get("Magento\Review\Model\ResourceModel\Review\CollectionFactory");

        //Apply filter for store id and status='Approved'
        $collection = $rating->create()->addStoreFilter($storeId
        )->addStatusFilter(\Magento\Review\Model\Review::STATUS_APPROVED);
            //Get All parameters from request
            $allParameters=$this->request->getParams();
           //Check parameter from_Date present or not
            if(array_key_exists("fromDate",$allParameters)){
                $collection=$collection->addFieldToFilter('created_at', ['gteq' => $allParameters['fromDate']]);
             }
             //Check parameter to_Date present or not
             if(array_key_exists("toDate",$allParameters)){
                $collection=$collection->addFieldToFilter('created_at', ['lteq' => $allParameters['toDate']]);
             }
             //Check parameter title present or not
             if(array_key_exists("title",$allParameters)){
                 $title=$allParameters['title'];
                $collection=$collection->addFieldToFilter('title', ['like' => '%'.$title.'%']);
             }
             //Check parameter text present or not
             if(array_key_exists("text",$allParameters)){
                $collection=$collection->addFieldToFilter('detail', ['like' => '%'.$allParameters['text'].'%']);
             }
             //Check parameter customer id present or not
             if(array_key_exists("customerId",$allParameters)){
                $collection=$collection->addFieldToFilter('customer_id', ['eq' => $allParameters['customerId']]);
             }
             //Check parameter product id present or not
             if(array_key_exists("productId",$allParameters)){
                $collection=$collection->addFieldToFilter('entity_pk_value', ['eq' => $allParameters['productId']]);
             }
             //Check paramter for maximum no. of product per page
             if(array_key_exists("pageSize",$allParameters)){
                $collection->setPageSize($allParameters['pageSize']);
             }
             //Check paramter for current page no. 
             if(array_key_exists("page",$allParameters)){
                $collection->setCurPage($allParameters['page']);
             }
            $result=$collection->getData();
            return $result;
    }

}

在上述方法中,首先在“商店ID”上应用过滤器,然后在URL中传递可选参数,例如customer_id,product_id。 特殊检查参数名称。

第5步。最后,在MyReviews文件夹中创建registration.php。

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'ECMAG_MyReviews',
    __DIR__
);

并调用系统升级命令-> php bin / magento setup:upgrade

在上述所有过程调用网址之后均为-` http://hostname/magento/index.php/rest/V1/showreview/allreviews/1'

当在url中传递参数时,例如- `http://hostname/magento/index.php/rest/V1/showreview/allreviews/1?productId=1'

希望它会对您有所帮助。