Менеджер HTTP запросов

Менеджер запросов реализует дополнительный слой абстракции над HTTP запросами. Он представляет собой экземпляр класса modHelpers\Request, который наследует класс Symfony\Component\HttpFoundation\Request. Он уже внедрён в контейнер. Для получения объекта менеджера нужно обратиться к контейнеру:

$request = app('request');

Менеджер запросов содержит большое количество методов для управления запросами к сайту. Вот основные из них:

  • query($key = null, $default = null) - возвращает значение переменных GET запроса.
  • input($key = null, $default = null) - возвращает значение переменных POST запроса.
  • cookie($key = null, $default = null) - возвращает куки.
  • server($key = null, $default = null) - возвращает данные переменной $_SERVER.
  • header($key = null, $default = null) - возвращает указанный заголовок запроса.
  • json($key = null, $default = null) - возвращает значение переменной из JSON запроса.
  • file($key, $default = null) - возвращает экземпляр класса modHelpers\UploadedFiles для указанного загруженного файла.
  • allFiles() - возвращает массив всех загруженных файлов.
  • all() - возвращает и переменные запроса и загруженные файлы.
  • ip() - возвращает ip клиента.
  • secure() - возвращает TRUE, если используется протокол HTTPS.
  • isAjax() - проверяет был ли запрос сделан через ajax.
  • isJson() - возвращает TRUE, если это JSON запрос.
  • exists($key) - проверяет, существует ли указанная переменная в запросе (аналог isset()).
  • has($key) - проверяет наличие непустой переменной в запросе (аналог !empty()).
  • only($keys) - возвращает подмножество переменных запроса, указанные в массиве ключей.
  • except($keys) - возвращает все переменные запроса за исключением указанных в массиве ключей.
  • intersect($keys) - возвращает пересечение указанных ключей.
  • merge(array $input) - выполняет слияние данных запроса и данных из указанного в ассоциативном массиве.
  • replace(array $input) - заменяет данные запроса на указанные в массиве.
  • filter(array $rules, $intersect = false) - фильтрует данные массива согласно указанным правилам. См. функцию filter_data().
  • root() - возвращает текущий базовый адрес сайта с протоколом и именем скрипта.
  • getHost($withSchema = false) - возвращает базовый адрес хоста без протокола. Чтобы включить протокол, нужно передать true в качестве параметра метода.
  • subDomain($index, $default = null) - возвращает поддомен согласно указанному индексу, начиная с 1.
  • subDomains() - возвращает массив поддоменов.
  • url() - возвращает URL текущего запроса без переменных запроса, указанных после знака ?.
  • fullUrl() - возвращает URL текущего запроса с переменными запроса.
  • path() - возвращает путь текущего запроса.
  • segments() - возвращает массив сегментов адреса текущего запроса.
  • segment($index, $default = null) - получает сегмент адреса текущего запроса по указанному индексу. Нумерация начинается с 1.
  • match($pattern) - проверяет соответствие пути текущего запроса указанной строке.
  • uploadFiles($path = '/', $source = null) - сохраняет загруженные файлы в указанной папке для указанного источника файлов. Если источник не указан, то будет взят источник, указанный в системной настройке default_media_source.
  • getMethod() - возвращает метод текущего запроса (GET, POST, HEAD и т.д.).
  • isMethod($method) - проверяет соответствие метода текущего запроса указанному.
  • getContent($asResource = false) - возвращает тело текущего запроса.
  • resource() - возвращает объект ресурса для запроса.
  • user() - возвращает текущего пользователя.
  • isBot() - проверяет соответствие юзер-агента запроса с юзер-агентами ботов, указанными в системной настройке modhelpers_bot_user_agents. Удобно для скрытия информации от ботов или для ведения статистики.
  • getCsrfToken() - возвращает токен из запроса, если он есть.
  • checkCsrfToken() - сравнивает токен пользователя и токен из запроса. Используется для защиты от межсайтовой подделки запросов.

Получение переменных

# Через функцию
$key = request('key', 'Значение по-умолчанию');
# Через менеджер запроса
$request = request();
$key = $request->input('key');
// или
$key = $request->key;
// или
$key = $request['key'];

Примеры работы с запросом

if (request()->isAjax()) // ajax запрос
if (request()->isJson()) // json запрос
// К json данным можно обращаться
$key = request()->json('key');
# Получить данные запроса 
$all = request()->all(); // Все данные вместе с файлами
$data = request()->input(); // POST данные
$data = request()->query(); // GET данные
$files = request()->allFiles(); // Загруженные файлы
$file = request()->file('avatar'); // Загруженный файл
# Выборочно
$data = request()->only([...]); // Только указанные данные из запроса
$data = request()->except([...]); // За исключением указанных данных из запроса
# URI  
// http://site.ru/path/to/page?var=value
request()->root(); // http://site.ru
request()->getHost(); // site.ru
request()->path(); // path/to/page
request()->url(); // http://site.ru/path/to/page
request()->fullUrl(); // http://site.ru/path/to/page?var=value
request()->segments();  // ['path','to','page']
request()->segment(1);  // 'path'
request()->query('var'); // 'value'
# Фильтрация 
$data = request()->filter($rules);
request()->input(); // Отфильтрованные данные

Работа с загруженными файлами

Для каждого загруженного файла создаётся экземпляр класса modHelpers\UploadedFile, который в свою очередь является наследником класса SplFileInfo.

$request = request();
// Загружает все файлы по указанному пути для указанного источника файлов.
$request->uploadFiles($path, $mediaSource);
// Можно обработать каждый файл отдельно
if ($request->hasFile('file')) {
    $request->file('file')->store('assets', $mediaSource);  // Имя файла будет захешировано
}
if ($request->hasFile('avatar')) {
    $request->avatar->storeAs('assets', 'avatar.jpg', $mediaSource); // Указываем имя
}
// Проверить MIME тип файла
if ($request->file('file')->getType() !== 'image/gif') {
    // Сообщение об ошибке
}

CSRF токены

Этот тип защиты придумали чтобы предотвратить возможность межсайтовой подделки запросов. Особенно это актуально при обновлении или удалении данных. Именно для реализации этой защиты предназначен метод checkCsrfToken().

// Только для POST запросов
if (request()->isMethod('POST') && request()->checkCsrfToken() {
    ...
} else {
    // Переадресация на страницу ошибки.
}
// Только для AJAX запросов
if (request()->isAjax() && request()->checkCsrfToken() { ... } else { die(['message' => 'CSRF токен не прошел проверку! ']]); }

Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.