4 个关注者

说你好

本节介绍如何在您的应用程序中创建一个新的“你好”页面。为了实现这个目标,您将创建一个 操作 和一个 视图

  • 该应用程序将把页面请求分派到操作
  • 操作将依次呈现显示“你好”字样的视图,以供最终用户查看。

通过本教程,您将学习三件事

  1. 如何创建一个 操作 来响应请求,
  2. 如何创建一个 视图 来组成响应的内容,以及
  3. 应用程序如何将请求分派到 操作

创建操作

对于“你好”任务,您将创建一个 say 操作,该操作从请求中读取 message 参数并将该消息显示回用户。如果请求没有提供 message 参数,则该操作将显示默认的“你好”消息。

信息: 操作 是最终用户可以直接引用以执行的对象。操作按 控制器 分组。操作的执行结果是最终用户将收到的响应。

操作必须在 控制器 中声明。为简单起见,您可以在现有的 SiteController 中声明 say 操作。此控制器在类文件 controllers/SiteController.php 中定义。以下是新操作的开始

<?php

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    // ...existing code...

    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

在上面的代码中,say 操作被定义为 SiteController 类中名为 actionSay 的方法。Yii 使用前缀 action 来区分控制器类中操作方法和非操作方法。action 前缀后的名称映射到操作的 ID。

在命名操作时,您应该了解 Yii 如何处理操作 ID。操作 ID 始终以小写形式引用。如果操作 ID 需要多个单词,它们将用连字符连接(例如,create-comment)。操作方法 ID 通过从 ID 中删除任何连字符,将每个单词的首字母大写,并以 action 为前缀,映射到操作名称。例如,操作 ID create-comment 对应于操作方法名称 actionCreateComment

我们示例中的操作方法接受参数 $message,其值默认为 "Hello"(与您在 PHP 中为任何函数或方法参数设置默认值的方式完全相同)。当应用程序收到请求并确定 say 操作负责处理该请求时,应用程序将使用请求中找到的相同名称的参数填充此参数。换句话说,如果请求包含一个名为 message 的参数,其值为 "Goodbye",则操作中的 $message 变量将被分配该值。

在动作方法中,调用了 render() 来渲染一个名为 say视图 文件。message 参数也被传递给视图,以便在视图中使用。动作方法返回渲染结果。该结果将被应用程序接收并在浏览器中显示给最终用户(作为完整 HTML 页面的一部分)。

创建视图

视图 是你用来生成响应内容的脚本。对于“Hello”任务,你需要创建一个 say 视图,它打印从动作方法接收到的 message 参数

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

say 视图应该保存在 views/site/say.php 文件中。当在一个动作中调用 render() 方法时,它会查找一个名为 views/ControllerID/ViewName.php 的 PHP 文件。

注意,在上面的代码中,message 参数在打印之前被 HTML 编码。这是必要的,因为参数来自最终用户,这使得它容易受到 跨站点脚本(XSS)攻击,通过在参数中嵌入恶意 JavaScript 代码。

当然,你可以在 say 视图中添加更多内容。内容可以包括 HTML 标签、纯文本,甚至 PHP 语句。事实上,say 视图只是一个由 render() 方法执行的 PHP 脚本。视图脚本打印的内容将作为响应的结果返回给应用程序。应用程序将反过来将此结果输出给最终用户。

尝试一下

创建动作和视图后,你可以通过访问以下 URL 来访问新页面

https://hostname/index.php?r=site%2Fsay&message=Hello+World

Hello World

此 URL 将显示一个显示“Hello World”的页面。该页面与其他应用程序页面共享相同的页眉和页脚。

如果在 URL 中省略 message 参数,你将看到页面仅显示“Hello”。这是因为 message 被作为参数传递给 actionSay() 方法,当它被省略时,将使用 "Hello" 的默认值。

信息:新页面与其他页面共享相同的页眉和页脚,因为 render() 方法会自动将 say 视图的结果嵌入到一个所谓的 布局 中,在本例中,布局位于 views/layouts/main.php

上面 URL 中的 r 参数需要更多解释。它代表 路由,这是一个应用程序范围内的唯一 ID,用于引用一个动作。路由的格式为 ControllerID/ActionID。当应用程序接收到请求时,它将检查此参数,使用 ControllerID 部分来确定应该实例化哪个控制器类来处理请求。然后,控制器将使用 ActionID 部分来确定应该实例化哪个动作来执行实际的工作。在这个例子中,路由 site/say 将被解析为 SiteController 控制器类和 say 动作。因此,将调用 SiteController::actionSay() 方法来处理请求。

信息:与动作类似,控制器也有 ID 来在应用程序中唯一标识它们。控制器 ID 使用与动作 ID 相同的命名规则。控制器类名是从控制器 ID 派生的,方法是删除 ID 中的连字符,将每个单词的第一个字母大写,并将结果字符串附加单词 Controller。例如,控制器 ID post-comment 对应于控制器类名 PostCommentController

总结

在本节中,你已经接触了 MVC 架构模式中的控制器和视图部分。你创建了一个动作作为控制器的一部分来处理特定请求。你还可以创建一个视图来组成响应的内容。在这个简单的例子中,没有涉及模型,因为唯一使用的数据是 message 参数。

你还可以了解 Yii 中的路由,它充当用户请求和控制器动作之间的桥梁。

在下一节中,你将学习如何创建模型,并添加一个包含 HTML 表单的新页面。

发现错误或你认为此页面需要改进?
在 github 上编辑它 !