Как передать массив JSON в метод API? - PullRequest
0 голосов
/ 15 марта 2019

Я создаю метод API, в который я хочу отправить массив пользовательских элементов JSON. Я не хочу иметь модель базы данных за моим объектом JSON. JSON - это просто способ отправки временных данных в мой метод API, и он не поддерживается напрямую никакими таблицами базы данных.

Вот данные JSON, которые я публикую:

{
   "stockItems": [
      {
        "sku": "SKU-1234",
        "qty": 15
      },
      {
        "sku": "SKU-5678",
        "qty": 25
      }
   ]
}

Вот моя пользовательская модель и интерфейс:

StockItemInterface.php

namespace MyCompany\CatalogInventory\Api\Data;

/**
 * @api
 */
interface StockItemInterface
{
    /**
     * @return float
     */
    public function getQty();

    /**
     * @return string
     */
    public function getSku();

    /**
     * @param float $qty
     * @return $this
     */
    public function setQty($qty);

    /**
     * @param string $sku
     * @return $this
     */
    public function setSku($sku);
}

Item.php

namespace MyCompany\CatalogInventory\Model\Stock;

use MyCompany\CatalogInventory\Api\Data\StockItemInterface;

class Item implements StockItemInterface
{
    protected $sku;

    protected $qty;

    /**
     * @param array $data
     */
    public function __construct(array $data = [])
    {
    }

    /**
     * @return float
     */
    public function getQty()
    {
        return $this->qty;
    }

    /**
     * @return string
     */
    public function getSku()
    {
        return $this->sku;
    }

    /**
     * @param float $qty
     * @return $this
     */
    public function setQty($qty)
    {
        $this->qty = $qty;
    }

    /**
     * @param string $sku
     * @return $this
     */
    public function setSku($sku)
    {
        $this->sku = $sku;
    }
}

Вот мой метод API

StockRegistryInterface.php

namespace MyCompany\CatalogInventory\Api;

/**
 * Interface StockRegistryInterface
 * @api
 */
interface StockRegistryInterface
{
    /**
    * @param \MyCompany\CatalogInventory\Api\Data\StockItemInterface[] $stockItems
    * @return int
    */
    public function updateStockItems(array $stockItems);
}

StockRegistry

namespace MyCompany\CatalogInventory\Model;

use Magento\Catalog\Model\ProductFactory;
use Magento\CatalogInventory\Api\Data\StockItemInterface;
use Magento\CatalogInventory\Api\StockConfigurationInterface;
use Magento\CatalogInventory\Api\StockItemCriteriaInterfaceFactory;
use Magento\CatalogInventory\Api\StockItemRepositoryInterface;
use Magento\CatalogInventory\Model\Spi\StockRegistryProviderInterface;
use MyCompany\CatalogInventory\Api\StockRegistryInterface;

/**
 * Class StockRegistry
 *
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class StockRegistry extends \Magento\CatalogInventory\Model\StockRegistry implements StockRegistryInterface
{
    /**
     * @param StockConfigurationInterface $stockConfiguration
     * @param StockRegistryProviderInterface $stockRegistryProvider
     * @param StockItemRepositoryInterface $stockItemRepository
     * @param StockItemCriteriaInterfaceFactory $criteriaFactory
     * @param ProductFactory $productFactory
     */
    public function __construct(
        StockConfigurationInterface $stockConfiguration,
        StockRegistryProviderInterface $stockRegistryProvider,
        StockItemRepositoryInterface $stockItemRepository,
        StockItemCriteriaInterfaceFactory $criteriaFactory,
        ProductFactory $productFactory
    ) {
        parent::__construct($stockConfiguration, $stockRegistryProvider, $stockItemRepository, $criteriaFactory, $productFactory);
    }

    /**
     * @inheritdoc
     */
    public function updateStockItems(array $stockItems)
    {
        // do stuff
    }
}

Когда я публикую свой метод API, я получаю эту ошибку

"Fatal Error: 'Uncaught Error: Cannot instantiate interface MyCompany\\CatalogInventory\\Api\\Data\\StockItemInterface in 
\/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/ObjectManager\/Factory\/AbstractFactory.php:111    
Stack trace:
#0 \/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/ObjectManager\/Factory\/Compiled.php(108): 
Magento\\Framework\\ObjectManager\\Factory\\AbstractFactory->createObject('MyCompany\\\\CatalogI...', Array)
#1 \/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/ObjectManager\/ObjectManager.php(56): 
Magento\\Framework\\ObjectManager\\Factory\\Compiled->create('MyCompany\\\\CatalogI...', Array)
#2 \/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/Webapi\/ServiceInputProcessor.php(166): 
Magento\\Framework\\ObjectManager\\ObjectManager->create('\\\\MyCompany\\\\Catalog...')
#3 \/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/Webapi\/ServiceInputProcessor.php(399): 
Magento\\Framework\\Webapi\\ServiceInputProcessor->_createFromArray('\\\\MyCompany\\\\Catalog...', Array)
#4 \/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/Webapi\/ServiceInputProcessor.php(332): 
' in '\/var\/www\/magento2\/lib\/internal\/Magento\/Framework\/ObjectManager\/Factory\/AbstractFactory.php' on line 111"

Исключение происходит в AbstractFactory.createObject:

protected function createObject($type, $args)
{
    return new $type(...array_values($args));
}

Проблема в том, что $args является пустым массивом, поэтому array_values выдает исключение.

Как мне написать свой класс Item, чтобы Magento мог его успешно построить без использования модели базы данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...