Encodera

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

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

Оглавление

Контроллеры

Контроллер — класс, который принимает запрос и готовит данные для страницы. Каждый его публичный метод называется действием и отвечает за одну страницу: список статей, одну статью, форму добавления.

Где лежат

Контроллеры находятся в папке 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.

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

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