What is the purpose of Extension attributes in Magento 2?

This article will throw some light on how one can use the extension attributes in Magento 2. Extension attributes are primarily containers that are used for adding an additional piece of information to our entities.

Every interface that extends \Magento\Framework\Api\ExtensibleDataInterface can be extended with the help of the extension attributes. The methods defined in ExtensibleDataInterface grants access to the objects that contain the additional data.

Below example will give you a clear picture of what we are trying to explain. For this first, we will create one module named DemoModule.

Step 1 - Declare Extension Attributes

We will be declaring the extension attributes in app/code/Aureatelabs/DemoModule/etc/extension_attributes.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
   <extension_attributes for="Magento\Checkout\Api\Data\ShippingInformationInterface">
       <attribute code="custom_shipping_charge" type="string"/>
   </extension_attributes>
</config>

This means that we are extending our shipping information Interface with an attribute. It's accessible from $order->getExtensionAttributes()->getCustomShippingAttribute().

Below are short descriptions that will explain what the words stand for:

  • for - The fully-qualified type name with the namespace that processes the extensions. The value must be a type that implements `ExtensibleDataInterface`. The interface can be in a different module.
  • code - The name of the attribute. The attribute name should be in snake case (the first letter in each word should be in lowercase, with each word separated by an underscore). 
  • type - The data type. This can be a simple data type, such as string or integer, or complex type, such as an interface.

Step 2 - Clear Generated Files

Now clear the var/generation when you run setup:di:compile command, new getter and setter methods will be added in /var/generation/Magento/Checkout/Api/Data/ShippingInformationExtensionInterface.php

Step 3 - Set/Get Attributes

Now you can set/get these attributes value by creating the instance of Magento/Checkout/Api/Data/ShippingInformationInterface.php interface.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$addressInformation = $objectManager->create('Magento\Checkout\Api\Data\ShippingInformationInterface');
$extAttributes = $addressInformation->getExtensionAttributes();

$selectedShipping = $extAttributes->getCustomShippingCharge();

One important thing to note, for the Extension Attributes to work as proposed we always need to query the entity for the existing extension_attributes via getExtensionAttributes() before using the extension attribute factory to create a new one. In case if we omit this check any previously set extension attributes on the entity will we wiped off.

One of the benefits that you will get from using Extension Attributes is that your added attribute data is automatically available through an API request.

  • Share :