My question is what is the function of the <parameter name="customerId" force="true">%customer_id%</parameter>
and how it work?
Magento gets the customer data with passing anything except token value in API call.
In between magento calls some API related controllers for the same
vendor/magento/module-customer/etc/webapi.xml
<route url="/V1/customers/me" method="GET">
<service class="Magento\Customer\Api\CustomerRepositoryInterface" method="getById"/>
<resources>
<resource ref="self"/>
</resources>
<data>
<parameter name="customerId" force="true">%customer_id%</parameter>
</data>
</route>
in this API call magento get customer data based on token.
Based on API url url="/V1/customers/me"
magento calls function from
Magento calls In-between call of dispatch function.
vendor/magento/module-webapi/Controller/Rest.php
public function dispatch(\Magento\Framework\App\RequestInterface $request)
{
/** In between code **/
// In the same file
$this->processApiRequest();
}
protected function processApiRequest()
{
$inputParams = $this->getInputParamsResolver()->resolve();
}
And this resolve()
function calls override()
function
vendor/magento/module-webapi/Controller/Rest/InputParamsResolver.php
public function resolve()
{
$inputData = $this->paramsOverrider->override($inputData, $route->getParameters());
}
and overide()
function calls getOverriddenValue()
function
vendor/magento/module-webapi/Controller/Rest/ParamsOverrider.php
public function override(array $inputData, array $parameters)
{
$value = $this->paramOverriders[$paramValue]->getOverriddenValue();
}
getOverriddenValue()
calls ParamOverriderInterface
vendor/magento/framework/Webapi/Rest/Request/ParamOverriderInterface.php
- To Override parameter values
- Parameters in the webapi.xml can be forced. This ensures that on
specific routes, a specific value is always used.
- For instance, if there is a
".../me/..."
route, the route should use
only user information specific to the
- currently logged in user. More specifically, if there was a
"/customers/me/addresses"
route, the service method
- invoked could have a signature of
"getAddresses($customerId)"
, but in
the webapi.xml
, the $customerId parameter
- would be forced to be the customer id of the current authenticated
user.
- The forced override parameter configuration is in the webapi.
<data>
<parameter name="customer.id" force="true">%customer_id%</parameter>
</data>
and for business logic of this function is in file -
vendor/magento/module-webapi/Controller/Rest/ParamOverriderCustomerId.php
/**
* {@inheritDoc}
*/
public function getOverriddenValue()
{
if ($this->userContext->getUserType() === UserContextInterface::USER_TYPE_CUSTOMER) {
return $this->userContext->getUserId();
}
return null;
}
So this is how Magento get Customer Id between API calls !!
Another solution
$ch = curl_init('dev.magento2.com/rest/V1/customers/me');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json'
));
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=' . $_COOKIE['PHPSESSID']);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$json = json_decode($result);
echo $json->id;