JohnCMS
Search…
Работа с запросом (Request)
Для работы с данными HTTP запроса в JohnCMS используется класс \Johncms\System\Http\Request. Он позволяет получить доступ к таким суперглобальным переменным как: $_POST, $_GET, $_COOKIE, $_FILES, $_SERVER. Это позволяет упростить получение значений по умолчанию, и фильтрацию данных, пришедших от пользователя. Давайте посмотрим на примеры.
Для начала необходимо получить объект класса Request.
1
/** @var \Johncms\System\Http\Request $request */
2
$request = di(\Johncms\System\Http\Request::class);
Copied!
Строка /** @var \Johncms\System\Http\Request $request */ не обязательна и служит лишь для работы автодополнения в IDE если вы конечно используете IDE.

Получение данных из $_GET

Предположим, что пользователь открыл страницу http://domain.com/?user_id=123 и нам нужно получить идентификатор пользователя 123. Сделать это можно следующим образом:
1
$user = $request->getQuery('user_id', 0, FILTER_VALIDATE_INT);
Copied!
Разберем что же тут происходит. Метод getQuery пытается получить user_id из суперглобального массива $_GET. Первым параметром принимает название параметра запроса, вторым параметром можно передать стандартное значение, а третим параметром передается фильтр, с помощью которого будет обработано значение. Вы можете ознакомиться со списком фильтров в официальной документации по этой ссылке: https://www.php.net/manual/ru/filter.filters.php
Коротко что делает строка из примера: Пытается получить параметр GET запроса user_id, если его нет, то возвращает 0, если есть, то очищает и возвращает число. Если передано не число, то вернет значение по умолчанию, то есть 0.

Получение данных из $_POST

Предположим, что отправлена форма, которая содержит user_id и name. Форма отправлена методом POST.
1
$user = $request->getPost('user_id', 0, FILTER_VALIDATE_INT);
2
$name = $request->getPost('name', '', FILTER_SANITIZE_STRING);
Copied!
Эти примеры работают так же как и предыдущий. Во втором примере от пользователя ожидается строка, а фильтр FILTER_SANITIZE_STRING удаляет из нее теги, и при необходимости удаляет или кодирует специальные символы.

Получение данных из $_COOKIE

1
$name = $request->getCookie('name', '', FILTER_SANITIZE_STRING);
Copied!
В этом примере как видите всё так же просто как и в предыдущих. Просто поменялось название метода, а принцип работы такой же.

Получение данных из $_SERVER

1
$user_agent = $request->getServer('HTTP_USER_AGENT', '', FILTER_SANITIZE_STRING);
Copied!
Этот пример работает так же как и остальные. Получает HTTP_USER_AGENT из суперглобальной переменной $_SERVER.

Получение данных из $_FILES

1
$files = $request->getUploadedFiles();
Copied!
Этот код вернет массив файлов, в котором каждый элемент будет представлен объектом класса GuzzleHttp\Psr7\UploadedFile. Если вы уже работали с выгрузкой файлов в php, то наверное знаете, что множественные файлы в массиве $_FILES описываются примерно так:
1
array(
2
'files' => array(
3
'name' => array(
4
0 => 'file0.txt',
5
1 => 'file1.html',
6
),
7
'type' => array(
8
0 => 'text/plain',
9
1 => 'text/html',
10
),
11
/* etc. */
12
),
13
)
Copied!
для работы с этим стандартными средствами вам необходимо позаботиться о сборе всех данных в нормальную структуру. Если вы используете метод getUploadedFiles, то эта задача уже решена для вас и массив файлов будет уже в нормальной структуре:
1
array(
2
'files' => array(
3
0 => array(
4
'name' => 'file0.txt',
5
'type' => 'text/plain',
6
/* etc. */
7
),
8
1 => array(
9
'name' => 'file1.html',
10
'type' => 'text/html',
11
/* etc. */
12
),
13
),
14
)
Copied!
Давайте рассмотрим пример сохранения файлов
Допустим, у нас есть такая форма, которая принимает 1 обычный файл и поле с возможностью выбирать несколько файлов.
1
<form action="" method="post" enctype="multipart/form-data">
2
<input type="file" name="file">
3
<input type="file" name="multiple_files[]" multiple>
4
<button type="submit">Отправить</button>
5
</form>
Copied!
Пример сохранения файлов будет выглядеть так:
1
$files = $request->getUploadedFiles();
2
3
// Сохраняем файл из обычного поля
4
if (! empty($files['file'])) {
5
/** @var $attached_file \Psr\Http\Message\UploadedFileInterface */
6
$attached_file = $files['file'];
7
try {
8
$attached_file->moveTo(UPLOAD_PATH . '/tmp/' . $attached_file->getClientFilename());
9
echo 'Файл успешно сохранен';
10
} catch (\Exception $exception) {
11
echo 'Ошибка сохранения файла: ' . $exception->getMessage();
12
}
13
}
14
15
// Сохраняем файлы из множественного поля
16
if (! empty($files['multiple_files'])) {
17
/** @var $multiple_files \Psr\Http\Message\UploadedFileInterface[] */
18
$multiple_files = $files['multiple_files'];
19
foreach ($multiple_files as $multiple_file) {
20
try {
21
$multiple_file->moveTo(UPLOAD_PATH . '/tmp/' . $multiple_file->getClientFilename());
22
echo 'Файл успешно сохранен';
23
} catch (\Exception $exception) {
24
echo 'Ошибка сохранения файла: ' . $exception->getMessage();
25
}
26
}
27
}
Copied!
В результате отправки формы с файлами, все файлы будут сохранены в папке upload/tmp c оригинальными названиями, с которыми отправил клиент.
Обратите внимание, что в примере рассмотрен простой вариант сохранения файлов без каких либо проверок допустимых типов файлов.