Mostrar un extension attribute en el api de Magento 2

, ,
extension attribute

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.