Данные запроса
Запрос — всё, что браузер прислал серверу: адрес, параметры после знака вопроса, поля формы, заголовки. В контроллере эти данные читают двумя способами: коротким помощником params() и через объект запроса getRequest(). Оба доступны в любом действии, создавать ничего не нужно.
Параметр из адреса
Параметры маршрута, описанные в настройках через двоеточие, читает fromRoute():
// module/Blog/src/Controller/PostController.php
public function viewAction()
{
$id = (int) $this->params()->fromRoute('id');
return new ViewModel(['id' => $id]);
}По адресу /blog/5 в переменной $id окажется число 5. Значение из адреса всегда строка, поэтому его приводят к целому числу.
Строка запроса
Параметры после знака вопроса читает fromQuery(). Второй аргумент — значение, если параметра нет:
public function indexAction()
{
$page = (int) $this->params()->fromQuery('page', 1);
$search = (string) $this->params()->fromQuery('q', '');
return new ViewModel(['page' => $page, 'search' => $search]);
}Для адреса /blog?page=2&q=php получится $page, равный 2, и $search, равный php. Для адреса /blog — 1 и пустая строка.
Все методы params
| Метод | Откуда берёт значение |
|---|---|
fromRoute('id') | Параметр маршрута |
fromQuery('page', 1) | Строка запроса после ? |
fromPost('title') | Поле формы, отправленной методом POST |
fromFiles('image') | Загруженный файл |
fromHeader('User-Agent') | Заголовок запроса (объект заголовка) |
Вызов без имени — например, fromQuery() — возвращает все значения массивом.
Объект запроса
Когда нужно узнать метод запроса или взять все данные формы сразу, используют getRequest():
public function addAction()
{
$request = $this->getRequest();
if ($request->isPost()) {
$data = $request->getPost()->toArray();
// $data['title'], $data['body']
}
return new ViewModel();
}Действие add отвечает и на открытие страницы (GET), и на отправку формы (POST). isPost() позволяет различить эти случаи.
| Метод | Что возвращает |
|---|---|
isGet(), isPost() | Совпадает ли метод запроса |
getPost('title') | Одно поле формы |
getPost()->toArray() | Все поля формы |
getQuery('page', 1) | Параметр строки запроса |
isXmlHttpRequest() | Запрос отправлен из JavaScript |
Частая ошибка
Данные запроса нельзя считать правильными. Значение fromQuery('page') может оказаться текстом, отрицательным числом или отсутствовать. Приводите типы — (int), (string) — и задавайте значение по умолчанию, а данные форм проверяйте правилами, о которых рассказывает урок о проверке данных.