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() возвращает параметр из объединенных GET- и POST-данных. При совпадении имен используется значение из POST. Параметры запроса доступны только для чтения: вызов set('param', $value) бросает исключение \Bitrix\Main\NotSupportedException.
-
Получить параметр GET или POST
$value = $request->get('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->getRequestMethod() === 'GET'; // вернет 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 для HTTP-запросов. Он предоставляет доступ к методу запроса, URL и переданным параметрам вместо глобальных переменных $_GET и $_POST.
Создавать объект HttpRequest вручную не требуется. Его можно получить через приложение и контекст:
use Bitrix\Main\Application;
$request = Application::getInstance()->getContext()->getRequest();
$name = $request->getPost('name');
$email = $request->getQuery('email');
Экранируйте данные при выводе в HTML. Метод getQuery() может вернуть строку, массив или null, поэтому перед выводом email проверьте тип значения. Используйте htmlspecialcharsbx() или \Bitrix\Main\Text\HtmlFilter::encode() — подробнее в статье XSS.
Выведите строковое значение email через htmlspecialcharsbx():
if (is_string($email))
{
echo htmlspecialcharsbx($email);
}
Для вывода через HtmlFilter::encode() используйте:
use Bitrix\Main\Text\HtmlFilter;
if (is_string($email))
{
echo HtmlFilter::encode($email);
}
Ответ (Response)
Класс \Bitrix\Main\HttpResponse хранит заголовки, cookies и содержимое HTTP-ответа. Методы класса вызывайте через объект ответа из текущего контекста:
use Bitrix\Main\Context;
$response = Context::getCurrent()->getResponse();
Используйте объект $response для работы с данными ответа:
HTTP-заголовки \Bitrix\Main\Web\HttpHeaders
-
Добавить заголовок
$response->addHeader($name, $value); -
Установить заголовок
$headers = new \Bitrix\Main\Web\HttpHeaders(); $headers->add('Content-Type', 'text/plain; charset=UTF-8'); $response->setHeaders($headers); -
Получить заголовки
$headers = $response->getHeaders();
Cookies \Bitrix\Main\Web\Cookie
-
Добавить cookie
$cookie = new \Bitrix\Main\Web\Cookie('display_mode', 'compact'); $response->addCookie($cookie); -
Получить cookies
$cookies = $response->getCookies();
Содержимое ответа
-
Установить контент
$response->setContent($content); -
Получить контент
$content = $response->getContent();
Для изменения ответа текущей страницы используйте Context::getCurrent()->getResponse(). Объект, созданный через new HttpResponse(), ядро само не отправит: его нужно явно передать приложению или отправить методом send().
Пример. Код формирует текстовый ответ с cookie и завершает приложение. Метод Application::end(0, $response) отправляет подготовленный ответ:
use Bitrix\Main\Application;
use Bitrix\Main\Context;
use Bitrix\Main\Web\Cookie;
$response = Context::getCurrent()->getResponse();
$response->addHeader('Content-Type', 'text/plain; charset=UTF-8'); // добавить заголовок
$response->addCookie(new Cookie('display_mode', 'compact')); // добавить cookie
$response->setContent('Hello, world!'); // установить контент
Application::getInstance()->end(0, $response);
Стандартные форматы ответов
-
AjaxJson — методы для JSON-ответов. Все ответы от контроллеров
\Bitrix\Main\Engine\Controllerимеют структуру, понятную для JS APIBX.ajax.runActionиBX.ajax.runComponentAction. Примеры вызововBX.ajax.runActionприведены в статье Контроллеры.{ "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']
]
]
*/