Magento 2 - "Свойство\"Слайдер\" не имеет соответствующего задатчика в классе "Magento\\Eav\\Api\\Данные\\Attributeoptionинтерфейс\"."
Я пытаюсь переопределить Magento\Eav\Api\Data\AttributeOptionInterface
в своем пользовательском модуле. Я хочу добавить одну новую опцию в существующий интерфейс.
Идея заключается в том, что на данный момент мы можем передавать только определенные данные параметров в параметрах атрибутов REST API
Смотрите ниже формат запроса API для большей ясности.
Api-интерфейс
Url = http://test.com/index.php/rest/V1/products/attributes/manufacturer/options/
Api Methodd - Post
Api body - {
"option": {
"label": "test",
"is_default": "true",
}
}
На данный момент он передает 3 параметра в качестве значения, я хочу добавить свой пользовательский 4-й параметр Ex-слайдер.
Итак, параметры должно быть
{
"option": {
"label": "test",
"is_default": "true",
"slider":"test1"
}
}
Я попытался переопределить интерфейс и его метод, но его задающий параметр свойств не определен
Сообщение об ошибке
"message": "Property \"Slider\" does not have corresponding setter in class \"Magento\\Eav\\Api\\Data\\AttributeOptionInterface\"."
Итак, мой вопрос в том, как я могу переопределить интерфейс API и передать свой пользовательский или добавить свой параметр в существующие параметры.
Спасибо.
1 answers
Чтобы решить эту проблему, нам требуется переопределить в основном два интерфейса и модель. После переопределения интерфейсов и модели переопределенные интерфейсы требуют привязки к модели с использованием di.xml для инициализации объектов во время вызова API.
Проверьте приведенный ниже код, чтобы добавить новые поля в Интерфейс атрибутов.
[ имя_пакета][имя_модуля]\etc\di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Eav\Model\Entity\Attribute\Option" type="[Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute\Option" />
<preference for="[Package_Name]\[Module_Name]\Api\Eav\Data\AttributeOptionInterface" type="[Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute\Option" />
<preference for="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" type="Magento\Catalog\Model\Product\Attribute\OptionManagement" />
</config>
[ имя_пакета][имя_модуля]\Api\Eav\Data\AttributeOptionInterface.php
<?php
namespace [Package_Name]\[Module_Name]\Api\Eav\Data;
interface AttributeOptionInterface extends \Magento\Eav\Api\Data\AttributeOptionInterface
{
/**
* Get slider
*
* @return string
*/
public function getSlider();
/**
* Set slider
*
* @param string $slider
* @return $this
*/
public function setSlider($slider);
}
[ имя_пакета][имя_модуля]\Model\Eav\Entity\Attribute\Option.php
<?php
namespace [Package_Name]\[Module_Name]\Model\Eav\Entity\Attribute;
class Option extends \Magento\Eav\Model\Entity\Attribute\Option implements \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface
{
/**
* {@inheritdoc}
*/
public function getSlider()
{
return $this->getData('slider');
}
/**
* Set slider value
*
* @param string $slider
* @return $this
*/
public function setSlider($slider)
{
return $this->setData('slider', $slider);
}
}
После переопределения интерфейса для добавления поля "ползунок" и переопределения option.php , требуется изменить тип параметра вызова API для параметров атрибута в webapi.xml для Magento_catalog модуль.
[ имя_пакета][имя_модуля]\etc\webapi.xml
<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="/V1/products/attributes/:attributeCode/options" method="GET">
<service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="getItems"/>
<resources>
<resource ref="Magento_Catalog::attributes_attributes" />
</resources>
</route>
<route url="/V1/products/attributes/:attributeCode/options" method="POST">
<service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="add" />
<resources>
<resource ref="Magento_Catalog::attributes_attributes" />
</resources>
</route>
<route url="/V1/products/attributes/:attributeCode/options/:optionId" method="DELETE">
<service class="[Package_Name]\[Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface" method="delete" />
<resources>
<resource ref="Magento_Catalog::attributes_attributes" />
</resources>
</route>
</routes>
И, Наконец,
[Package_Name][Module_Name]\Api\Catalog\ProductAttributeOptionManagementInterface.php
<?php
namespace [Package_Name]\[Module_Name]\Api\Catalog;
/**
* @api
*/
interface ProductAttributeOptionManagementInterface
{
/**
* Retrieve list of attribute options
*
* @param string $attributeCode
* @throws \Magento\Framework\Exception\StateException
* @throws \Magento\Framework\Exception\InputException
* @return \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface[]
*/
public function getItems($attributeCode);
/**
* Add option to attribute
*
* @param string $attributeCode
* @param \Ktpl\SliderEavOptions\Api\Eav\Data\AttributeOptionInterface $option
* @throws \Magento\Framework\Exception\StateException
* @throws \Magento\Framework\Exception\InputException
* @return bool
*/
public function add($attributeCode, $option);
/**
* Delete option from attribute
*
* @param string $attributeCode
* @param string $optionId
* @throws \Magento\Framework\Exception\StateException
* @throws \Magento\Framework\Exception\NoSuchEntityException
* @throws \Magento\Framework\Exception\InputException
* @return bool
*/
public function delete($attributeCode, $optionId);
}