Контроллеры
Контроллер — класс, который принимает запрос и готовит данные для страницы. Каждый его публичный метод называется действием и отвечает за одну страницу: список статей, одну статью, форму добавления.
Где лежат
Контроллеры находятся в папке src/Controller. Имя класса — множественное число с окончанием Controller, имя файла совпадает с именем класса.
Создание
bin/cake bake controller ArticlesКоманда создаёт src/Controller/ArticlesController.php. Если таблицы articles в базе ещё нет, создайте файл вручную:
// src/Controller/ArticlesController.php
namespace App\Controller;
class ArticlesController extends AppController
{
public function index(): void
{
$this->set('title', 'Статьи');
}
}Адрес /articles вызывает действие index(). Метод set() передаёт в шаблон переменную $title со значением «Статьи».
Шаблон действия
Вызывать шаблон явно не нужно: после действия фреймворк сам выводит файл templates/Articles/index.php. Создайте его:
<h1><?= h($title) ?></h1>Откройте /articles — на странице появится заголовок «Статьи». Без этого файла вы увидите ошибку «Missing Template» с подсказкой, где его создать.
Несколько переменных
public function index(): void
{
$title = 'Статьи';
$articles = ['Первая статья', 'Вторая статья'];
$this->set(compact('title', 'articles'));
}Функция compact() собирает массив из переменных с теми же именами. В шаблоне будут доступны $title и $articles.
Действие с аргументом
public function view(int $id): void
{
$this->set('id', $id);
}Часть адреса после имени действия попадает в аргумент: /articles/view/5 вызовет view(5). Шаблон этого действия — templates/Articles/view.php.
Общий код
Все контроллеры наследуют AppController из файла src/Controller/AppController.php. То, что нужно на каждой странице, пишут в нём:
// src/Controller/AppController.php
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Flash');
}initialize() выполняется перед любым действием. Компонент — готовый блок кода для контроллеров; Flash показывает сообщения вроде «Статья сохранена».
Частая ошибка
Действием становится каждый публичный метод контроллера, и его можно вызвать по адресу. Вспомогательный метод, объявленный как public, тоже откроется в браузере — например, /articles/calculate-total. Методы, которые не являются страницами, объявляйте protected или private.