Работа с запросом (Request)

С версии: 9.2.0
53

Для работы с данными HTTP запроса в JohnCMS используется класс \Johncms\System\Http\Request. Он позволяет получить доступ к таким суперглобальным переменным как: $_POST, $_GET, $_COOKIE, $_FILES, $_SERVER. Это позволяет упростить получение значений по умолчанию, и фильтрацию данных, пришедших от пользователя. Давайте посмотрим на примеры.

Для начала необходимо получить объект класса Request.

/** @var \Johncms\System\Http\Request $request */
$request = di(\Johncms\System\Http\Request::class);

Строка /** @var \Johncms\System\Http\Request $request */ не обязательна и служит лишь для работы автодополнения в IDE если вы конечно используете IDE.

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

Предположим, что пользователь открыл страницу http://domain.com/?user_id=123 и нам нужно получить идентификатор пользователя 123. Сделать это можно следующим образом:

$user = $request->getQuery('user_id', 0, FILTER_VALIDATE_INT);

Разберем что же тут происходит. Метод getQuery пытается получить user_id из суперглобального массива $_GET.
Первым параметром принимает название параметра запроса, вторым параметром можно передать стандартное значение, а третим параметром передается фильтр, с помощью которого будет обработано значение. Вы можете ознакомиться со списком фильтров в официальной документации по этой ссылке: https://www.php.net/manual/ru/filter.filters.php

Коротко что делает строка из примера: Пытается получить параметр GET запроса user_id, если его нет, то возвращает 0, если есть, то очищает и возвращает число. Если передано не число, то вернет значение по умолчанию, то есть 0.

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

Предположим, что отправлена форма, которая содержит user_id и name. Форма отправлена методом POST.

$user = $request->getPost('user_id', 0, FILTER_VALIDATE_INT);
$name = $request->getPost('name', '', FILTER_SANITIZE_STRING);

Эти примеры работают так же как и предыдущий. Во втором примере от пользователя ожидается строка, а фильтр FILTER_SANITIZE_STRING удаляет из нее теги, и при необходимости удаляет или кодирует специальные символы.

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

$name = $request->getCookie('name', '', FILTER_SANITIZE_STRING);

В этом примере как видите всё так же просто как и в предыдущих. Просто поменялось название метода, а принцип работы такой же.

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

$user_agent = $request->getServer('HTTP_USER_AGENT', '', FILTER_SANITIZE_STRING);

Этот пример работает так же как и остальные. Получает HTTP_USER_AGENT из суперглобальной переменной $_SERVER.

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

$files = $request->getUploadedFiles();

Этот код вернет массив файлов, в котором каждый элемент будет представлен объектом класса GuzzleHttp\Psr7\UploadedFile. Если вы уже работали с выгрузкой файлов в php, то наверное знаете, что множественные файлы в массиве $_FILES описываются примерно так:

array(
    'files' => array(
        'name' => array(
            0 => 'file0.txt',
            1 => 'file1.html',
        ),
        'type' => array(
            0 => 'text/plain',
            1 => 'text/html',
        ),
        /* etc. */
    ),
)

для работы с этим стандартными средствами вам необходимо позаботиться о сборе всех данных в нормальную структуру. Если вы используете метод getUploadedFiles, то эта задача уже решена для вас и массив файлов будет уже в нормальной структуре:

array(
    'files' => array(
        0 => array(
            'name' => 'file0.txt',
            'type' => 'text/plain',
            /* etc. */
        ),
        1 => array(
            'name' => 'file1.html',
            'type' => 'text/html',
            /* etc. */
        ),
    ),
)

Давайте рассмотрим пример сохранения файлов

Допустим, у нас есть такая форма, которая принимает 1 обычный файл и поле с возможностью выбирать несколько файлов.

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="file" name="multiple_files[]" multiple>
    <button type="submit">Отправить</button>
</form>

Пример сохранения файлов будет выглядеть так:

$files = $request->getUploadedFiles();

// Сохраняем файл из обычного поля
if (! empty($files['file'])) {
    /** @var  $attached_file \Psr\Http\Message\UploadedFileInterface */
    $attached_file = $files['file'];
    try {
        $attached_file->moveTo(UPLOAD_PATH . '/tmp/' . $attached_file->getClientFilename());
        echo 'Файл успешно сохранен';
    } catch (\Exception $exception) {
        echo 'Ошибка сохранения файла: ' . $exception->getMessage();
    }
}

// Сохраняем файлы из множественного поля
if (! empty($files['multiple_files'])) {
    /** @var  $multiple_files \Psr\Http\Message\UploadedFileInterface[] */
    $multiple_files = $files['multiple_files'];
    foreach ($multiple_files as $multiple_file) {
        try {
            $multiple_file->moveTo(UPLOAD_PATH . '/tmp/' . $multiple_file->getClientFilename());
            echo 'Файл успешно сохранен';
        } catch (\Exception $exception) {
            echo 'Ошибка сохранения файла: ' . $exception->getMessage();
        }
    }
}

В результате отправки формы с файлами, все файлы будут сохранены в папке upload/tmp c оригинальными названиями, с которыми отправил клиент.

Обратите внимание, что в примере рассмотрен простой вариант сохранения файлов без каких либо проверок допустимых типов файлов.