Методы, запрос, ссылки и перенаправления
В одном контроллере обычно несколько методов: один показывает страницу, другой принимает форму. Каждому методу нужно прочитать то, что пришло в запросе, и часто — построить ссылку на другую страницу. Этим занимаются три объекта реестра: $this->request, $this->url и $this->response.
Второй метод
Добавьте метод в контроллер из прошлого урока:
// catalog/controller/information/hello.php
public function about(): void
{
$this->response->setOutput('Об этой странице');
}Метод пишут в адресе после точки: index.php?route=information/hello.about. По адресу открываются только методы public.
Чтение запроса
public function index(): void
{
$name = $this->request->get['name'] ?? 'гость';
$this->response->setOutput('Здравствуйте, ' . $name . '!');
}Откройте index.php?route=information/hello&name=Anna — страница покажет «Здравствуйте, Anna!». Без параметра — «Здравствуйте, гость!».
| Свойство | Что в нём |
|---|---|
$this->request->get | Параметры из адреса |
$this->request->post | Поля формы |
$this->request->files | Загруженные файлы |
$this->request->cookie | Куки |
$this->request->server | Данные сервера: метод, IP-адрес, заголовки |
Это обычные массивы. Обращение к отсутствующему ключу вызывает предупреждение, поэтому всегда задавайте значение по умолчанию через ??. Числа приводят к типу: (int) ($this->request->get['product_id'] ?? 0).
Строки из запроса движок пропускает через htmlspecialchars(), поэтому <b> приходит как <b>.
Ссылки
Адреса не собирают вручную. Метод link() принимает маршрут и параметры:
$language = 'language=' . $this->config->get('config_language');
$about = $this->url->link('information/hello.about', $language);
$product = $this->url->link('product/product', $language . '&product_id=42');В $about окажется http://shop.test/index.php?route=information/hello.about&language=en-gb. Если включены SEO-адреса, тот же вызов вернёт короткий адрес. В четвёртой версии параметр language передают в каждой ссылке витрины.
Перенаправление
public function old(): void
{
$this->response->redirect($this->url->link('information/hello', 'language=' . $this->config->get('config_language')));
}Откройте index.php?route=information/hello.old — браузер перейдёт на основной метод страницы. redirect() сам завершает запрос, exit после него не нужен.
Страница не найдена
Когда запрошенной записи нет, контроллер отправляет статус 404:
$this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . ' 404 Not Found');После этого он выводит страницу как обычно — ядро делает это шаблоном error/not_found.
Частая ошибка
Вспомогательный метод объявляют как public — и его может вызвать кто угодно по адресу: index.php?route=information/hello.cleanup. Всё, что не является страницей или обработчиком формы, должно быть private или protected.