Alexander Makarov
10 years ago
2 changed files with 125 additions and 0 deletions
After Width: | Height: | Size: 32 KiB |
@ -0,0 +1,125 @@
|
||||
Говорим «Привет» |
||||
============ |
||||
|
||||
В этом разделе рассмотрим как создать новую страницу с надписью "Привет" в вашем приложении. |
||||
Чтобы достигнуть этой цели, вы создадите [действие (action)](structure-controllers.md), а также [представление (view)](structure-views.md): |
||||
|
||||
* Приложение обработает запрос страницы и передаст управление соответствующему действию; |
||||
* Действие, в свою очередь, отобразит представление с надписью "Привет" конечному пользователю. |
||||
|
||||
С помощью данного руководства вы изучите |
||||
|
||||
* Как создавать [действие](structure-controllers.md), чтобы отвечать на запросы; |
||||
* Как создавать [представление](structure-views.md), чтобы компоновать содержимое ответа; |
||||
* Как приложение отсылает запросы к [действию](structure-controllers.md). |
||||
|
||||
|
||||
Создание Действия <a name="creating-action"></a> |
||||
------------------ |
||||
|
||||
Для "Привет"-приложения вы создадите `say` [действие](structure-controllers.md), которое читает параметр `message` из запроса и отображает его же пользователю. |
||||
Если в запросе не содержится параметра `message`, то действие будет отображать "Привет" по умолчанию. |
||||
|
||||
> Информация: [Действия](structure-controllers.md) являются объектами (не путать с базовым понятием ООП - прим. пер.), непосредственно с которыми конечные пользователи взаимодействуют. |
||||
Действия сгруппированы с помощью [контроллеров](structure-controllers.md). Результатом выполнения действия является ответ, который конечный пользователь в итоге получает. |
||||
|
||||
Действия должны быть объявлены в [контроллерах](structure-controllers.md). Для простоты, вы можете объявить действие `say` в существующем контроллере `SiteController`, который определен |
||||
в файле класса `controllers/SiteController.php`: |
||||
|
||||
```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` ответственно за обработку запрос, |
||||
приложение извлекает параметр с таким же именем из запроса. |
||||
|
||||
Внутри метода действия вызывается [[yii\web\Controller::render()|render()]], чтобы отобразить [представление](structure-views.md) |
||||
с именем `say`. Параметр `message` также передается в представление, чтобы отобразить на странице. Результат возвращается методом действия, который будет взят приложением и отображен конечному пользователю. |
||||
|
||||
|
||||
Создание Представления <a name="creating-view"></a> |
||||
--------------- |
||||
|
||||
[Представления](structure-views.md) являются скриптами, которые вы пишите, чтобы составлять тело ответа. |
||||
Для нашего "Привет"-приложения вы создадите представление `say`, чтобы вывести параметр `message`, полученный из метода действия: |
||||
|
||||
```php |
||||
<?php |
||||
use yii\helpers\Html; |
||||
?> |
||||
<?= Html::encode($message) ?> |
||||
``` |
||||
|
||||
Представление `say` должно быть сохранено в файле `views/site/say.php`. Когда метод [[yii\web\Controller::render()|render()]] |
||||
вызывается в действии, он будет искать PHP файл с именем типа `views/ControllerID/ActionID/ViewName.php`. |
||||
|
||||
Заметьте, что в коде выше параметр `message` подвергается [[yii\helpers\Html::encode()|HTML-шифровке]] |
||||
перед выводом. Это обязательная процедура, так как параметр приходит от клиента, которые может попытаться провести |
||||
[XSS атаку](http://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B6%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3) |
||||
путем вставки зловредного JavaScript кода в этот параметр. |
||||
|
||||
Вы можете дополнить представление `say` другим содержимым. Это может быть HTML теги, текст или PHP выражения. |
||||
Фактически, представление `say` - просто PHP скрипт, который вызывается методом [[yii\web\Controller::render()|render()]]. |
||||
Содержимое выводимое скриптом представления будет отправлено приложением пользователю. |
||||
|
||||
|
||||
Попробуем <a name="trying-it-out"></a> |
||||
------------- |
||||
|
||||
После создания действия и представления вы можете перейти на новую страницу по следующему URL: |
||||
|
||||
``` |
||||
http://hostname/index.php?r=site/say&message=Hello+World |
||||
``` |
||||
|
||||
![Hello World](images/start-hello-world.png) |
||||
|
||||
Это отобразит страницу с надписью "Hello World". Страница использует ту же шапку и футер, как и остальные страницы приложения. |
||||
Если вы опустите параметр `message` в URL, вы увидите "Привет" на странице. |
||||
Это происходит из-за того, что `message` передается в метод `actionSay()` и, когда он опущен, начинает работать значение по умолчанию "Привет". |
||||
|
||||
> Информация: Новая страница использует ту же шапку и футер, что и другие страницы, потому что метод [[yii\web\Controller::render()|render()]] |
||||
автоматически вставляет результат представления `say` в, так называемый, [макет](structure-views.md) `views/layouts/main.php`. |
||||
|
||||
Параметр `r` требует больше объяснений. Он связан с [маршрутом (route)](runtime-routing.md), который представляет собой уникальный идентификатор, указывающий на действие. |
||||
Его формат `ControllerID/ActionID`. Когда приложение получает запрос, оно проверяет параметр `r` и, используя часть `ControllerID`, определяет какой контроллер следует инициализировать, чтобы обработать запрос. |
||||
Затем, контроллер использует часть `ActionID`, чтобы определить какое действие должно использоваться для выполнения реальных операций. В нашем случае маршрут `site/say` будет разрешен в контроллер `SiteController` и |
||||
действие `say`. В результате, метод `SiteController::actionSay()` будет вызван, чтобы обработать запрос. |
||||
|
||||
> Информация: Как и действия, контроллеры тоже имеют идентификаторы, которые однозначно определяют их в приложении. |
||||
Идентификаторы контроллеров используют те же правила именования, что и идентификаторы действий. Имена классов контроллеров получаются путем удаления дефисов из идентификатора, преобразования первой буквы каждого слова в |
||||
верхний регистр и добавления слова `Controller` в конец. Например, идентификатор контроллера `post-comment` соответствует имени класса контроллера `PostCommentController`. |
||||
|
||||
|
||||
Резюме <a name="summary"></a> |
||||
------- |
||||
|
||||
В этом разделе вы коснулись тем контроллеров и представлений в паттерне MVC. |
||||
Вы создали действие как часть контроллера, чтобы обрабатывать запросы. Также, вы создали представление, чтобы составлять содержимое ответа. |
||||
В этом процессе никак не была задействована модель, так как в качестве данных выступает лишь простой параметр `message`. |
||||
|
||||
Вы также изучили концепцию маршрутизации, которая является связующим звеном между пользовательским запросом и действиями контроллеров. |
||||
|
||||
В следующем разделе вы ознакомитесь с тем, как создавать модели и добавлять новые страницы с HTML формами. |
Loading…
Reference in new issue