Mostrar un extension attribute en el api de Magento 2
Cuando añadimos un extension attribute a un modelo de Magento, por defecto no se muestra su valor en las peticiones api/rest que hagamos. Para ello, debemos escribir un código que capture el evento load_after e incluya los extension attributes.
Vamos a tomar como ejemplo un campo ‘custom_field’ que hemos añadido a la tabla de pedidos y que rellenamos en un evento cuando se cree un pedido.
Lo primero es definir este campo como un extension_attribute. Para ello insertamos este código en el fichero ‘etc/extension_attributes.xml’:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Api/etc/extension_attributes.xsd">
<extension_attributes for="Magento\Sales\Api\Data\OrderInterface">
<attribute code="custom_field" type="string" />
</extension_attributes>
</config>
Ahora lo que necesitamos es crear un evento que añada los extension attributes al modelo cuando se cargue. Para ello añadimos este código al fichero ‘etc/events.xml’:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_order_load_after">
<observer name="sales_order_load_order_attribute" instance="Gsoft\Module\Observer\OrderLoadAfter" />
</event>
</config>
Y creamos el observer que gestionará el evento:
<?php
namespace Gsoft\Module\Observer;
use Magento\Framework\Event\ObserverInterface;
class OrderLoadAfter implements ObserverInterface
{
public function execute(\Magento\Framework\Event\Observer $observer)
{
$order = $observer->getOrder();
$extensionAttributes = $order->getExtensionAttributes();
if ($extensionAttributes === null) {
$extensionAttributes = $this->getOrderExtensionDependency();
}
$attr = $order->getData('custom_field');
$extensionAttributes->setCustomField($attr);
$order->setExtensionAttributes($extensionAttributes);
/**@var $order \Magento\Sales\Model\Order**/
}
private function getOrderExtensionDependency()
{
$orderExtension = \Magento\Framework\App\ObjectManager::getInstance()->get(
'\Magento\Sales\Api\Data\OrderExtension'
);
return $orderExtension;
}
}
Para que esto funcione, la carpeta /var/generation ha de ser eliminada (o la carpeta generated/code, si usamos una de las últimas versiones de Magento 2), y vaciamos la cache desde consola con el siguiente comando:
/php bin/magento cache:flush
Si hemos seguido todos los pasos, podremos obtener nuestro atributo dentro del nodo “extension_attributes” de la respuesta que obtenemos a través del api. De todas formas, si necesitas una ayuda no dudes en contactar con nosotros.