Говорим «Привет»
В этом разделе рассмотрим как создать новую страницу с надписью «Привет». В процессе решения задачи вы создадите действие контроллера и представление:
- Приложение обработает запрос и передаст управление соответствующему действию;
- Действие, в свою очередь, отобразит представление с надписью "Привет" конечному пользователю.
С помощью данного руководства вы изучите
- Как создавать действие, чтобы отвечать на запросы;
- Как создавать представление, чтобы формировать содержимое ответа;
- Как приложение отсылает запросы к действию.
Создание Действия
Для нашей задачи потребуется действие 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
, используется метод
[[yii\web\Controller::render()|render()]]. Для того, чтобы вывести сообщение, в отображение передаётся параметр message
.
Результат отображения при помощи return
передаётся приложению, которое отдаёт его пользователю.
Создание представления
Представления являются скриптами, которые используются для формирования тела ответа. Для нашего
приложения вы создадите представление say
, которое будет выводить параметр message
, полученный из метода действия:
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
Представление say
должно быть сохранено в файле views/site/say.php
. Когда метод [[yii\web\Controller::render()|render()]]
вызывается в действии, он будет искать PHP файл с именем вида views/ControllerID/ViewName.php
.
Стоит отметить, что в коде выше параметр message
[[yii\helpers\Html::encode()|экранируется для HTML]] перед выводом.
Это обязательно так как параметр приходит от пользователя, который может попытаться провести
XSS атаку
путём вставки зловредного JavaScript кода.
Вы можете дополнить представление say
HTML тегами, текстом или кодом PHP. Фактически, представление say
является
простым PHP скриптом, который выполняется методом [[yii\web\Controller::render()|render()]]. Содержимое, выводимое
скриптом представления, будет передано пользователю приложением.
Попробуем
После создания действия и представления вы можете перейти на новую страницу по следующему URL:
http://hostname/index.php?r=site/say&message=Привет+мир
Будет отображена страница с надписью «Привет мир». Она использует ту же шапку и футер, что и остальные страницы приложения.
Если вы не укажете параметр message
, то увидите на странице «Привет». Это происходит потому, как message
передаётся
в метод actionSay()
и значение по умолчанию — «Привет».
Info: Новая страница использует ту же шапку и футер, что и другие страницы, потому что метод [[yii\web\Controller::render()|render()]] автоматически вставляет результат представления
say
в, так называемый, макетviews/layouts/main.php
.
Параметр r
требует дополнительных пояснений. Он связан с маршрутом (route), который представляет
собой уникальный идентификатор, указывающий на действие. Его формат ControllerID/ActionID
. Когда приложение получает
запрос, оно проверяет параметр r
и, используя ControllerID
, определяет какой контроллер следует использовать для
обработки запроса. Затем, контроллер использует часть ActionID
, чтобы определить какое действие выполняет реальную работу.
В нашем случае маршрут site/say
будет соответствовать контроллеру SiteController
и его действию say
.
В результате, для обработки запроса будет вызван метод SiteController::actionSay()
.
Info: Как и действия, контроллеры также имеют идентификаторы, которые однозначно определяют их в приложении. Идентификаторы контроллеров используют те же правила именования, что и идентификаторы действий. Имена классов контроллеров получаются путём удаления дефисов из идентификатора, преобразования первой буквы каждого слова в верхний регистр и добавления в конец
Controller
. Например, идентификатор контроллераpost-comment
соответствует имени класса контроллераPostCommentController
.
Заключение
В этом разделе вы затронули тему контроллеров и представлений в паттерне MVC. Вы создали действие как часть контроллера,
обрабатывающего запросы, и представление, участвующее в формировании ответа. В этом процессе никак не была задействована
модель, так как в качестве данных выступает лишь простой параметр message
.
Также вы познакомились с концепцией маршрутизации, которая является связующим звеном между запросом пользователя и действием контроллера.
В следующем разделе вы узнаете как создавать модели и добавлять новые страницы с HTML формами.