Дата последнего изменения: 15.10.2024
Если запрограммированы контроллеры внутри модуля, то их легко сделать доступными для модуля REST. Это удобно, так как мы повторно используем уже написанный код.
Для этого нужно лишь поправить конфиг модуля .settings.php
.
Поэтому, если вы не хотите, чтобы какой-то контроллер был доступен по REST API, то:
protected function getDefaultPreFilters() { return [ parent::getDefaultPreFilters(), new Engine\ActionFilter\Scope(Engine\ActionFilter\Scope::NOT_REST), ]; }
Итак, как включить в модуле интеграцию:
<?php #.settings.php return [ 'controllers' => [ 'value' => [ 'defaultNamespace' => '\\Bitrix\\Disk\\Controller', 'restIntegration' => [ 'enabled' => true, ], ], 'readonly' => true, ] ];
Если вдруг ajax-действие должно использовать \CRestServer для какой-то специфической задачи, то это можно легко решить, объявив одним из параметров \CRestServer.
Пример:
public function getStorageForAppAction($clientName, \CRestServer $restServer) { $clientId = $restServer->getClientId(); ... }
Будьте внимательны, в примере выше действие не будет работать через обычный ajax, так как \CRestServer $restServer
там отсутствует и не может быть внедрен. Оно будет доступно только для модуля REST. Если же объявить его необязательным, то всё будет работать.
public function getStorageForAppAction($clientName, \CRestServer $restServer = null) { if ($restServer) { $clientId = $restServer->getClientId(); } ... }
Может возникнуть задача, что нужно отличить в каком контексте сейчас выполняется действие: это REST или это AJAX? Для этого можно спросить у контролера:
\Bitrix\Main\Engine\Controller::getScope() //возможные варианты \Bitrix\Main\Engine\Controller::SCOPE_REST \Bitrix\Main\Engine\Controller::SCOPE_AJAX \Bitrix\Main\Engine\Controller::SCOPE_CLI