Action
Yii 使用 action
前缀区分普通方法和动作。 action
前缀后面的名称被映射为动作的 ID。
涉及到给动作命名时,你应该理解 Yii 如何处理操作 ID。 动作 ID 总是被以小写处理,如果一个操作 ID 由多个单词组成, 单词之间将由破折号连接(如 create-comment)。动作 ID 映射为方法名时移除了破折号, 将每个单词首字母大写,并加上 action 前缀。 比如:动作 ID create-comment 对应方法名 actionCreateComment
举例:
访问login界面 http://localhost/index.php?r=site/login
,
这里对用控制器的动作是这样的,函数名为action
+ login
public function actionLogin()
{
if (!Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
}
return $this->render('login', [
'model' => $model,
]);
}
带一个参数的情况(参数$message
的默认值为Hello
),随后用来渲染一个名为 say 的视图文件,参数会被传过去:
public function actionSay($message = 'Hello')
{
return $this->render('say', ['message' => $message]);
}
View
say
视图应该存为 views/site/say.php
文件。当一个动作中调用了 yii\web\Controller::render()
方法时, 它将会寻找名为 views/控制器 ID/视图名.php 的PHP文件。
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
注意以上代码,message 参数在输出之前被 yii\helpers\Html::encode()
方法处理过。 这很有必要,当参数来自于最终用户时, 参数中可能隐含的恶意 JavaScript 代码会导致 跨站脚本(XSS)攻击。
当然了,你大概会在 say 视图里放入更多内容。内容可以由 HTML 标签,纯文本, 甚至 PHP 语句组成。实际上 say 视图就是一个由yii\web\Controller::render()
执行的 PHP 脚本。 视图脚本输出的内容将会作为响应结果返回给应用。应用将依次输出结果给最终用户。
http://localhost/Yii/basic/web/index.php?r=site/say&message=Hello+World
yii\web\Controller::render() 方法会把自动把 say
视图执行的结果嵌入称为布局的文件中, 位于 views/layouts/main.php
,因此看起来和首页有相同的头部和尾部。
url中的参数解释:
r: 表示路由,是整个应用级的, 指向特定动作的独立 ID。路由格式是 控制器 ID/操作 ID
。 与动作一样,一个应用中控制器同样有唯一的 ID.
应用接受请求的时候会检查参数, 使用控制器 ID
去确定哪个控制器应该被用来处理请求。 然后相应控制器将使用动作 ID 去确定哪个操作方法将被用来做具体工作。
在本例子中,路由 site/say
将被解析至 SiteController
控制器和其中的 say
动作。 因此 SiteController::actionSay()
方法将被调用处理请求。