Request и Response
Запрос (Request)
Request — это абстрактный класс, который предоставляет информацию о текущем запросе. Он позволяет узнать метод и протокол, запрошенный URL, переданные параметры и другие данные. Класс расширяет \Bitrix\Main\Type\ParameterDictionary.
Класс обращается к пространствам имен:
-
\Main\Type — работает с типами данных,
-
\Main\IO — работает с файлами,
-
\Main\Text — работает с текстом.
Пример использования:
use Bitrix\Main\Application;
use Bitrix\Main\Context;
$context = Application::getInstance()->getContext();
$request = $context->getRequest();
// Или более кратко:
$request = Context::getCurrent()->getRequest();
Параметры запроса
-
Получить параметр GET или POST
$value = $request->get("param"); $value = $request["param"]; -
Получить GET-параметры
$value = $request->getQuery("param"); // получить параметр param $values = $request->getQueryList(); // получить список всех параметров -
Получить POST-параметры
$value = $request->getPost("param"); // получить параметр param $values = $request->getPostList(); // получить список всех параметров -
Получить загруженный файл
$value = $request->getFile("param"); // получить файл param $values = $request->getFileList(); // получить список всех загруженных файлов -
Получить значение cookie
$value = $request->getCookie("param"); // получить cookie param $values = $request->getCookieList(); // получить список всех cookies
Данные о запросе
-
Получить метод запроса
$method = $request->getRequestMethod(); -
Проверить тип запроса
$flag = $request->isGet(); // вернет true, если GET-запрос $flag = $request->isPost(); // вернет true, если POST-запрос $flag = $request->isAjaxRequest(); // вернет true, если AJAX-запрос $flag = $request->isHttps(); // вернет true, если HTTPS-запрос
Данные о запрошенной странице
-
Проверить нахождение в административном разделе
$flag = $request->isAdminSection(); // вернет true, если находимся в административном разделе -
Получить запрошенный адрес
$requestUri = $request->getRequestUri(); // например, "/catalog/category/?param=value" -
Получить запрошенную страницу
$requestPage = $request->getRequestedPage(); // например, "/catalog/category/index.php" -
Получить директорию запрошенной страницы
$rDir = $request->getRequestedPageDirectory(); // например, "/catalog/category"
Класс HttpRequest
HttpRequest — это класс, который управляет объектом Request. Он содержит информацию о текущем запросе, включая его тип и параметры. Этот класс помогает избежать использования глобальных переменных, которые применялись в старом ядре.
Создавать объект HttpRequest вручную не требуется. Его можно получить через приложение и контекст:
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
$name = $request->getPost("name");
$email = htmlspecialchars($request->getQuery("email"));
Ответ (Response)
Класс \Bitrix\Main\HttpResponse — это базовый класс для работы с HTTP-ответами. Он служит контейнером для:
HTTP-заголовков \Bitrix\Main\Web\HttpHeaders
-
Добавить заголовок
\Bitrix\Main\HttpResponse::addHeader( $name, $value ) -
Установить заголовок
\Bitrix\Main\HttpResponse::setHeaders( Web\HttpHeaders $headers ) -
Получить заголовок
\Bitrix\Main\HttpResponse::getHeaders()
Cookies \Bitrix\Main\Web\Cookie
-
Добавить cookie
\Bitrix\Main\HttpResponse::addCookie( Web\Cookie $cookie, $replace, $checkExpires ) -
Получить cookies
\Bitrix\Main\HttpResponse::getCookies()
Контента \Bitrix\Main\HttpResponse::$content
-
Установить контент
\Bitrix\Main\HttpResponse::setContent( $content ) -
Получить контент
\Bitrix\Main\HttpResponse::getContent()
С помощью HttpResponse можно формировать ответы приложения любого типа и содержания.
$response = new \Bitrix\Main\HttpResponse();
$response->addHeader('Content-Type', 'text/plain'); // добавить заголовок
$response->addCookie(new \Bitrix\Main\Web\Cookie('Biscuits', 'Yubileynoye')); // добавить cookie
$response->setContent('Hello, world!'); // установить контент
Стандартные форматы ответов
-
AjaxJson — методы для JSON-ответов. Все ответы от контроллеров
\Bitrix\Main\Engine\Controllerимеют структуру, понятную для JS API BX.ajax.runAction, BX.ajax.runComponentAction.{ "status": "string", "data": "mixed", "errors": [] } -
Json — формирует JSON-ответ. Преобразует данные в JSON, конвертирует в UTF-8 и устанавливает заголовок
application/json; charset=UTF-8.new \Bitrix\Main\Engine\Response\Json('ping-pong'); /** Content-Type: application/json; charset=UTF-8 "ping-pong" **/ new \Bitrix\Main\Engine\Response\Json([ 'id' => 2208, 'type' => 'license', ]); /** Content-Type: application/json; charset=UTF-8 {"id": 2208, "type": "license"} **/ -
Component — работает с компонентами. Для загрузки компонента через AJAX:
new \Bitrix\Main\Engine\Response\Component( 'bitrix:disk.file.view', '', [ 'FILE_ID' => $fileId, ] );Формирует ответ для представления компонента:
{ "status": string, "data": { "html": string, "assets": { "css": array, "js": array, "string": array }, "additionalParams": array }, "errors": array }
Файлы и изображения
-
BFile — работает с файлами. Используется для скачивания файлов из таблицы
b_file. -
ResizedImage — уменьшает изображения.
-
Zip/Archive — работает с архивом. Для NGINX можно использовать расширение mod_zip для создания архивов без нагрузки на PHP.
use \Bitrix\Main\Engine\Response; $archive = new Response\Zip\Archive('archive.zip'); $archive->addEntry(Response\Zip\ArchiveEntry::createFromFileId($fileId)); -
Zip/ArchiveEntry — описывает элемент zip-архива.
Управление ответом
Класс Redirect автоматически делает:
-
проверки безопасности,
-
редирект с 301 или 302 статусом.
// сделать переадресацию с 302 статусом
$response = new \Bitrix\Main\Engine\Response\Redirect('/auth');
// сделать переадресацию с 301 статусом
$response = new \Bitrix\Main\Engine\Response\Redirect('/auth');
$response->setStatus('301 Moved Permanently');
Преобразование данных
Класс Converter конвертирует строки и массивы. Для настройки преобразований класс использует битовые маски.
| Константа | Описание |
|---|---|
TO_SNAKE |
Перевести в snake_case. |
TO_SNAKE_DIGIT |
Перевести в snake_case с поддержкой цифр. |
TO_CAMEL |
Перевести в camelCase. |
TO_UPPER |
Перевести в верхний регистр. |
TO_LOWER |
Перевести в нижний регистр. |
LC_FIRST |
Перевести первую букву в нижний регистр. |
UC_FIRST |
Перевести первую букву в верхний регистр. |
KEYS |
Применить преобразования к ключам ассоциативного массива. |
VALUES |
Применить преобразования к значениям массива. |
RECURSIVE |
Выполнить преобразования рекурсивно для массива и вложенных массивов. |
Есть предустановленный формат Converter::OUTPUT_JSON_FORMAT, который использует константы: TO_CAMEL, KEYS, RECURSIVE.
Методы класса:
-
__construct($format)— создает объект с заданными преобразованиями, -
process($data)— применяет преобразования к строке или массиву, -
getFormat(): int— возвращает текущий формат, -
setFormat($format)— устанавливает новый формат, -
toJson()— создает объект с форматомOUTPUT_JSON_FORMAT.
use \Bitrix\Main\Engine\Response\Converter;
// Преобразование строки: первая буква в нижний регистр + camelCase
$converter = new Converter(Converter::LC_FIRST | Converter::TO_CAMEL);
echo $converter->process('la_la_land'); // laLaLand
// Подготовка массива для JSON-ответа
$converter = new Converter(Converter::OUTPUT_JSON_FORMAT);
$result = $converter->process([
'CATEGORIES' => [
['ID' => 1, 'NAME' => 'Foods'],
['ID' => 12, 'NAME' => 'Auto'],
]
]);
/*
[
'categories' => [
['id' => 1, 'name' => 'foods'],
['id' => 12, 'name' => 'auto'],
],
]
*/
// Комбинация преобразований
$converter = new Converter(
Converter::TO_SNAKE_DIGIT |
Converter::KEYS |
Converter::VALUES |
Converter::RECURSIVE
);
$result = $converter->process([
'property109',
'props' => [
'element1' => ['property210']
]
]);
/*
[
'property_109',
'props' => [
'element_1' => ['property_210']
]
]
*/