_config = $config; $this->_routeFactory = $routeFactory; } /** * Create route object. * * @param array $routeData Expected format: *
array(
* 'routePath' => '/categories/:categoryId',
* 'class' => \Magento\Catalog\Api\CategoryRepositoryInterface::class,
* 'serviceMethod' => 'item'
* 'secure' => true
* );
* @return \Magento\Webapi\Controller\Rest\Router\Route
*/
protected function _createRoute($routeData)
{
/** @var $route \Magento\Webapi\Controller\Rest\Router\Route */
$route = $this->_routeFactory->createRoute(
\Magento\Webapi\Controller\Rest\Router\Route::class,
$routeData[self::KEY_ROUTE_PATH]
);
$route->setServiceClass($routeData[self::KEY_CLASS])
->setServiceMethod($routeData[self::KEY_METHOD])
->setSecure($routeData[self::KEY_IS_SECURE])
->setAclResources($routeData[self::KEY_ACL_RESOURCES])
->setParameters($routeData[self::KEY_PARAMETERS]);
return $route;
}
/**
* Get service base URL
*
* @param \Magento\Framework\Webapi\Rest\Request $request
* @return string|null
*/
protected function _getServiceBaseUrl($request)
{
$baseUrlRegExp = '#^/?\w+/\w+#';
$serviceBaseUrl = preg_match($baseUrlRegExp, $request->getPathInfo(), $matches) ? $matches[0] : null;
return $serviceBaseUrl;
}
/**
* Generate the list of available REST routes. Current HTTP method is taken into account.
*
* @param \Magento\Framework\Webapi\Rest\Request $request
* @return Route[] matched routes
* @throws \Magento\Framework\Webapi\Exception
*/
public function getRestRoutes(\Magento\Framework\Webapi\Rest\Request $request)
{
$requestHttpMethod = $request->getHttpMethod();
$servicesRoutes = $this->_config->getServices()[Converter::KEY_ROUTES];
$routes = [];
// Return the route on exact match
if (isset($servicesRoutes[$request->getPathInfo()][$requestHttpMethod])) {
$methodInfo = $servicesRoutes[$request->getPathInfo()][$requestHttpMethod];
$routes[] = $this->_createRoute(
[
self::KEY_ROUTE_PATH => $request->getPathInfo(),
self::KEY_CLASS => $methodInfo[Converter::KEY_SERVICE][Converter::KEY_SERVICE_CLASS],
self::KEY_METHOD => $methodInfo[Converter::KEY_SERVICE][Converter::KEY_SERVICE_METHOD],
self::KEY_IS_SECURE => $methodInfo[Converter::KEY_SECURE],
self::KEY_ACL_RESOURCES => array_keys($methodInfo[Converter::KEY_ACL_RESOURCES]),
self::KEY_PARAMETERS => $methodInfo[Converter::KEY_DATA_PARAMETERS],
]
);
return $routes;
}
$serviceBaseUrl = $this->_getServiceBaseUrl($request);
ksort($servicesRoutes, SORT_STRING);
foreach ($servicesRoutes as $url => $httpMethods) {
// skip if baseurl is not null and does not match
if (!$serviceBaseUrl || strpos(trim($url, '/'), trim($serviceBaseUrl, '/')) !== 0) {
// base url does not match, just skip this service
continue;
}
foreach ($httpMethods as $httpMethod => $methodInfo) {
if (strtoupper($httpMethod) == strtoupper($requestHttpMethod)) {
$aclResources = array_keys($methodInfo[Converter::KEY_ACL_RESOURCES]);
$routes[] = $this->_createRoute(
[
self::KEY_ROUTE_PATH => $url,
self::KEY_CLASS => $methodInfo[Converter::KEY_SERVICE][Converter::KEY_SERVICE_CLASS],
self::KEY_METHOD => $methodInfo[Converter::KEY_SERVICE][Converter::KEY_SERVICE_METHOD],
self::KEY_IS_SECURE => $methodInfo[Converter::KEY_SECURE],
self::KEY_ACL_RESOURCES => $aclResources,
self::KEY_PARAMETERS => $methodInfo[Converter::KEY_DATA_PARAMETERS],
]
);
}
}
}
return $routes;
}
}