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

/**
* Login action.
*
* @return Response|string
*/
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() 方法将被调用处理请求。