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

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

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

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

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

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

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

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

Действия объявляются в контроллерах. Для простоты, вы можете объявить действие `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` считается идентификатором соответствующего действия.

> Информация: Идентификаторы действий задаются в нижнем регистре. Если идентификатор состоит из нескольких слов, они соединяются дефисами, то есть `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()` и значение по умолчанию — «Привет».

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

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

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

## Заключение ¶

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

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

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