- Модуль: rest
- Путь к файлу: ~/bitrix/modules/rest/classes/general/rest_provider.php
- Класс: CRestProvider
- Вызов: CRestProvider::getMethod
static function getMethod($query, $n, CRestServer $server): array
{
$result = [
'isExisting' => false,
'isAvailable' => false,
];
$name = $query['name'];
if (!empty($name))
{
$currentScope = self::getScope($server);
$currentScope[] = CRestUtil::GLOBAL_SCOPE;
$cache = Cache::createInstance();
if ($cache->initCache(
ScopeManager::CACHE_TIME,
'info' . md5($name . implode('|', $currentScope)),
ScopeManager::CACHE_DIR . 'method/'
))
{
$result = $cache->getVars();
}
elseif ($cache->startDataCache())
{
$method = ScopeManager::getInstance()->getMethodInfo($name);
$arMethods = $server->getServiceDescription();
foreach ($arMethods as $scope => $methodList)
{
if (!empty($methodList[$name]))
{
if (in_array($scope, $currentScope, true))
{
$result['isAvailable'] = true;
}
$result['isExisting'] = true;
}
}
if (!$result['isExisting'])
{
$request = new HttpRequest(
Context::getCurrent()->getServer(),
[
'action' => $method['method'],
],
[],
[],
[]
);
$router = new Router($request);
/** @var Controller $controller */
[$controller, $action] = Resolver::getControllerAndAction(
$router->getVendor(),
$router->getModule(),
$router->getAction(),
Controller::SCOPE_REST
);
if ($controller)
{
if (in_array($method['scope'], $currentScope, true))
{
$result['isAvailable'] = true;
}
$result['isExisting'] = true;
}
}
$cache->endDataCache($result);
}
}
return $result;
}