Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Методы, запрос, ссылки и перенаправления

В одном контроллере обычно несколько методов: один показывает страницу, другой принимает форму. Каждому методу нужно прочитать то, что пришло в запросе, и часто — построить ссылку на другую страницу. Этим занимаются три объекта реестра: $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> приходит как &lt;b&gt;.

Ссылки

Адреса не собирают вручную. Метод 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.