Magento provides two types of attributes for entities. And here we going to learn how to add a new extension attribute in Magento. Please follow the below steps to add the extension attribute:
Step 1: Add extension attribute
Here we will add an extension attribute in extension_attributes.xml which resides under the etc folder of your custom module.
For scalar attributes:
<?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\Customer\Api\Data\CustomerInterface">
<attribute code="stripe_id" type="boolean" />
</extension_attributes>
</config>
Here, the scalar attributes indicate the simple form of attribute representation, such as an integer, a string, or a boolean. Specify the class or interface of the extension attributes inside the “for” attribute of the <extension_attributes> tag. In this case, it is the CustomerInterface. The attribute is specified with a unique code and its type.
For non-scalar attributes:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<type name="Magento\Customer\Api\CustomerRepositoryInterface">
<plugin name="add_stripe_id" type="Magento\SomeModule\Api\Data\CustomInterface"/>
</type>
</config>
Step 2: Add/Update extension attribute values using Plugin
To add an extension attribute with customer data we need to add a plugin for Customer Repository. A plugin should be created for individual methods which are used like: get, save, and getById. Here we will see how to pass additional data in customer sessions. For this follow below:
Add plugin in di.xml file:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<type name="Magento\Customer\Api\CustomerRepositoryInterface">
<plugin name="add_stripe_id" type="Magento\SomeModule\Plugin\CustomerPlugin"/>
</type>
</config>
<?php
namespace Magento\SomeModule\Plugin;
use Magento\Customer\Api\CustomerRepositoryInterface;
use Magento\Customer\Api\Data\CustomerInterface;
use Magento\Framework\Api\ExtensionAttributesFactory;
use Magento\Customer\Api\Data\CustomerExtensionInterface;
use Magento\Framework\App\ResourceConnection;
class CustomerPlugin
{
/**
* @var ExtensionAttributesFactory
*/
private $extensionFactory;
/**
* @var ResourceConnection
*/
private $resourceConnection;
/**
* @param ExtensionAttributesFactory $extensionFactory
* @param ResourceConnection $resourceConnection
*/
public function __construct(
ExtensionAttributesFactory $extensionFactory,
ResourceConnection $resourceConnection
) {
$this->extensionFactory = $extensionFactory;
$this->resourceConnection = $resourceConnection;
}
/**
* Plugin after getById customer that adds customer's stripeId.
*
* @param CustomerRepositoryInterface $subject
* @param CustomerInterface $customer
* @return CustomerInterface
*/
public function afterGetById(CustomerRepositoryInterface $subject, CustomerInterface $customer)
{
$extensionAttributes = $customer->getExtensionAttributes();
if ($extensionAttributes === null || $extensionAttributes->getStripeId() === null) {
$connection = $this->resourceConnection->getConnection();
$select = $connection->select()->from(
['stripe_customers'], ['stripe_id']
)->where("customer_id = ?", $customer->getId());
$stripeId = $connection->fetchOne($select);
$this->addStripeIdExtensionAttribute($customer, $stripeId);
}
return $customer;
}
/**
* Set Stripe Id extension attribute
*
* @param CustomerInterface $customer
* @param string $stripeId
*/
private function addStripeIdExtensionAttribute(CustomerInterface $customer, string $stripeId): void
{
$extensionAttributes = $customer->getExtensionAttributes();
if ($extensionAttributes === null) {
/** @var CustomerExtensionInterface $extensionAttributes */
$extensionAttributes = $this->extensionFactory->create(CustomerInterface::class);
$customer->setExtensionAttributes($extensionAttributes);
}
$extensionAttributes->setStripeId($stripeId);
}
}
Comments
Post a Comment