Я создаю метод 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 мог его успешно построить без использования модели базы данных?