本节介绍如何在您的应用程序中创建一个新的“你好”页面。为了实现这个目标,您将创建一个 操作 和一个 视图
通过本教程,您将学习三件事
对于“你好”任务,您将创建一个 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
此 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
。例如,控制器 IDpost-comment
对应于控制器类名PostCommentController
。
在本节中,你已经接触了 MVC 架构模式中的控制器和视图部分。你创建了一个动作作为控制器的一部分来处理特定请求。你还可以创建一个视图来组成响应的内容。在这个简单的例子中,没有涉及模型,因为唯一使用的数据是 message
参数。
你还可以了解 Yii 中的路由,它充当用户请求和控制器动作之间的桥梁。
在下一节中,你将学习如何创建模型,并添加一个包含 HTML 表单的新页面。
发现错误或你认为此页面需要改进?
在 github 上编辑它 !
注册 或 登录 以发表评论。