Encodera

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

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

Оглавление

Контроллеры и действия

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

Где лежит контроллер

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

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

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