Менеджер 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 токен не прошел проверку! ']]); }