Контроллеры и действия
Контроллер — класс, который принимает запрос и возвращает ответ. Каждая страница — это его метод, который называют действием. Обычно один контроллер отвечает за одну сущность сайта: статьи, комментарии, пользователей.
Где лежит контроллер
Контроллеры хранятся в папке controllers. Отдельной команды для создания нет — файл создают вручную. Создайте controllers/PostController.php:
// controllers/PostController.php
namespace app\controllers;
use yii\web\Controller;
class PostController extends Controller
{
public function actionIndex(): string
{
return 'Список статей';
}
}Откройте http://localhost:8080/index.php?r=post/index — появится строка «Список статей».
Правила имён
Yii находит контроллер по имени, поэтому имена должны следовать правилам:
- имя класса заканчивается на
Controller, имя файла совпадает с именем класса; - пространство имён —
app\controllers; - метод действия открытый (
public) и начинается сaction.
В маршруте имена пишутся строчными буквами, слова разделяются дефисом:
| Класс и метод | Маршрут |
|---|---|
PostController::actionIndex() | post/index |
PostController::actionView() | post/view |
PostController::actionCreateDraft() | post/create-draft |
BlogPostController::actionIndex() | blog-post/index |
Параметры действия
Аргументы метода Yii берёт из параметров адреса с такими же именами. Добавьте в PostController второе действие:
// controllers/PostController.php
public function actionView(int $id): string
{
return "Статья номер $id";
}Адрес index.php?r=post/view&id=5 покажет «Статья номер 5». Без параметра id Yii вернёт ошибку 400 «Bad Request», а при id=abc — тоже 400, потому что тип аргумента объявлен как int.
Аргумент со значением по умолчанию становится необязательным:
public function actionIndex(int $page = 1): string
{
return "Список статей, страница $page";
}Действие по умолчанию
Если в маршруте указан только контроллер, выполняется действие index: адрес ?r=post равнозначен ?r=post/index. Адрес без маршрута открывает site/index — главную страницу. Заменить её можно в config/web.php:
// config/web.php
$config = [
'defaultRoute' => 'post/index',
// ...
];Теперь http://localhost:8080/ показывает список статей.
Что возвращает действие
| Возвращаемое значение | Результат |
|---|---|
| Строка | Текст страницы |
$this->render('index') | Страница из шаблона |
$this->redirect(['post/index']) | Перенаправление |
$this->asJson([...]) | Ответ в формате JSON |
Шаблоны, перенаправления и JSON разобраны в следующих уроках.
Частая ошибка
Имя действия из нескольких слов в адресе пишется через дефис: метод actionCreateDraft() — это маршрут post/create-draft, а не post/createDraft. Обращение по неверному имени заканчивается ошибкой 404.