Контроллеры
Контроллер — класс, методы которого отвечают на запросы. Маршрут решает, какой метод вызвать, а метод возвращает ответ: текст, страницу или перенаправление. Контроллеры лежат в папке app/Controllers, по одному классу в файле.
Создание контроллера
php spark make:controller PostsКоманда создаёт файл app/Controllers/Posts.php с пустым методом index(). Заполните его:
// app/Controllers/Posts.php
namespace App\Controllers;
class Posts extends BaseController
{
public function index(): string
{
return 'Список статей';
}
}Имя файла совпадает с именем класса, включая заглавную букву. Сам по себе контроллер ещё не открывается в браузере — ему нужен маршрут.
Подключение маршрута
// app/Config/Routes.php
$routes->get('posts', 'Posts::index');Откройте http://localhost:8080/posts — появится строка «Список статей». Запись Posts::index означает «класс Posts, метод index».
Параметр из адреса
Значение из адреса приходит в метод аргументом. Добавьте маршрут и метод:
// app/Config/Routes.php
$routes->get('posts/(:num)', 'Posts::show/$1', ['as' => 'posts.show']);// app/Controllers/Posts.php
public function show(int $id): string
{
return "Статья №$id";
}Адрес /posts/5 выведет «Статья №5».
Страница не найдена
Если нужной записи нет, контроллер бросает исключение, и посетитель видит страницу с кодом 404:
use CodeIgniter\Exceptions\PageNotFoundException;
public function show(int $id): string
{
if ($id > 100) {
throw PageNotFoundException::forPageNotFound('Статья не найдена');
}
return "Статья №$id";
}Строка use ставится в начале файла, после namespace.
BaseController
Все контроллеры наследуют класс BaseController из файла app/Controllers/BaseController.php. От него каждый контроллер получает готовые свойства:
| Свойство | Что это |
|---|---|
$this->request | Текущий запрос: данные формы, параметры адреса |
$this->response | Ответ: заголовки, код состояния, JSON |
$this->helpers | Список помощников, подключаемых автоматически |
В BaseController удобно держать код, общий для всех страниц.
Частая ошибка
Создать контроллер недостаточно: без строки в app/Config/Routes.php адрес вернёт 404. Автоматический поиск контроллера по адресу в CodeIgniter 4 по умолчанию выключен. Проверьте командой php spark routes, что нужный адрес есть в списке и метод контроллера объявлен как public.