Говорим «Привет»

В этом разделе рассмотрим как создать новую страницу с надписью «Привет». В процессе решения задачи вы создадите действие контроллера и представление:

  • Приложение обработает запрос и передаст управление соответствующему действию;
  • Действие, в свою очередь, отобразит представление с надписью "Привет" конечному пользователю.

С помощью данного руководства вы изучите

  • Как создавать действие, чтобы отвечать на запросы;
  • Как создавать представление, чтобы формировать содержимое ответа;
  • Как приложение отсылает запросы к действию.

Создание Действия

Для нашей задачи потребуется действие say, которое читает параметр message из запроса и отображает его значение пользователю. Если в запросе не содержится параметра message, то действие будет выводить «Привет».

Info: Действия могут быть запущены непосредственно пользователем и сгруппированы в контроллеры. Результатом выполнения действия является ответ, который получает пользователь.

Действия объявляются в контроллерах. Для простоты, вы можете объявить действие say в уже существующем контроллере SiteController, который определен в файле класса controllers/SiteController.php:

<?php

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    // ...существующий код...

    public function actionSay($message = 'Привет')
    {
        return $this->render('say', ['message' => $message]);
    }
}

В приведенном коде действие say объявлено как метод actionSay в классе SiteController. Yii использует префикс action чтобы различать методы-действия и обычные методы. Название после префикса action считается идентификатором соответствующего действия.

Info: Идентификаторы действий задаются в нижнем регистре. Если идентификатор состоит из нескольких слов, они соединяются дефисами, то есть create-comment. Имена методов действий получаются путём удаления дефисов из идентификатора, преобразования первой буквы каждого слова в верхний регистр и добавления префикса action. Например, идентификатор действия create-comment соответствует методу actionCreateComment.

Метод действия принимает параметр $message, который по умолчанию равен "Привет". Когда приложение получает запрос и определяет, что действие say ответственно за его обработку, параметр заполняется одноимённым значением из запроса.

Внутри метода действия, для вывода отображения представления с именем say, используется метод render(). Для того, чтобы вывести сообщение, в отображение передаётся параметр message. Результат отображения при помощи return передаётся приложению, которое отдаёт его пользователю.

Создание представления

Представления являются скриптами, которые используются для формирования тела ответа. Для нашего приложения вы создадите представление say, которое будет выводить параметр message, полученный из метода действия:

<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

Представление say должно быть сохранено в файле views/site/say.php. Когда метод render() вызывается в действии, он будет искать PHP файл с именем вида views/ControllerID/ViewName.php.

Стоит отметить, что в коде выше параметр message экранируется для HTML перед выводом. Это обязательно так как параметр приходит от пользователя, который может попытаться провести XSS атаку путём вставки зловредного JavaScript кода.

Вы можете дополнить представление say HTML тегами, текстом или кодом PHP. Фактически, представление say является простым PHP скриптом, который выполняется методом render(). Содержимое, выводимое скриптом представления, будет передано пользователю приложением.

Попробуем

После создания действия и представления вы можете перейти на новую страницу по следующему URL:

http://hostname/index.php?r=site%2Fsay&message=Привет+мир

Привет, мир

Будет отображена страница с надписью «Привет мир». Она использует ту же шапку и футер, что и остальные страницы приложения. Если вы не укажете параметр message, то увидите на странице «Привет». Это происходит потому, как message передаётся в метод actionSay() и значение по умолчанию — «Привет».

Info: Новая страница использует ту же шапку и футер, что и другие страницы, потому что метод render() автоматически вставляет результат представления say в, так называемый, макет views/layouts/main.php.

Параметр r в нашем URL требует дополнительных пояснений. Он связан с маршрутом (route), который представляет собой уникальный идентификатор, указывающий на действие. Его формат ControllerID/ActionID. Когда приложение получает запрос, оно проверяет параметр r и, используя ControllerID, определяет какой контроллер использовать для обработки запроса. Затем, контроллер использует часть ActionID, чтобы определить, какое действие выполняет реальную работу. В нашем случае маршрут site/say будет соответствовать контроллеру SiteController и его действию say. В результате для обработки запроса будет вызван метод SiteController::actionSay().

Info: Как и действия, контроллеры также имеют идентификаторы, которые однозначно определяют их в приложении. Идентификаторы контроллеров используют те же правила именования, что и идентификаторы действий. Имена классов контроллеров получаются путём удаления дефисов из идентификатора, преобразования первой буквы каждого слова в верхний регистр и добавления в конец Controller. Например, идентификатор контроллера post-comment соответствует имени класса контроллера PostCommentController.

Заключение

В этом разделе вы затронули тему контроллеров и представлений в паттерне MVC. Вы создали действие как часть контроллера, обрабатывающего запросы, и представление, участвующее в формировании ответа. В этом процессе никак не была задействована модель, так как в качестве данных выступает лишь простой параметр message.

Также вы познакомились с концепцией маршрутизации, которая является связующим звеном между запросом пользователя и действием контроллера.

В следующем разделе вы узнаете как создавать модели и добавлять новые страницы с HTML формами.