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’:
1 2 3 4 5 6 |
<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’:
1 2 3 4 5 6 7 |
<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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?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.