Yii - 使用 action 操作
要在控制器类中创建操作,您应该定义一个名称以单词 action 开头的公共方法。操作的返回数据表示要发送给最终用户的响应。
步骤 1 − 让我们在 ExampleController 中定义 hello-world 操作。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[
'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
步骤 2 − 在 Web 浏览器的地址栏中输入 http://localhost:8080/index.php?r=example/hello-world。您将看到以下内容。
操作 ID 通常是动词,例如创建、更新、删除等。这是因为操作通常旨在对资源执行特定的更改。
操作 ID 应该只包含这些字符 − 小写英文字母、数字、连字符和下划线。
操作有两种类型:内联和独立。
内联操作在控制器类中定义。动作的名称以这种方式从动作 ID 派生而来 −
- 将动作 ID 的所有单词的首字母变为大写。
- 删除连字符。
- 添加动作前缀。
示例 −
- index 变为 actionIndex。
- hello-world(如上例所示)变为 actionHelloWorld。
如果您计划在不同的地方重复使用相同的动作,则应将其定义为独立动作。
创建独立动作类
要创建独立动作类,您应该扩展 yii\base\Action 或子类,并实现 run() 方法。
步骤1 − 在项目根目录中创建一个组件文件夹。在该文件夹中创建一个名为 GreetingAction.php 的文件,其中包含以下代码。
<?php
namespace app\components;
use yii\base\Action;
class GreetingAction extends Action {
public function run() {
return "Greeting";
}
}
?>
我们刚刚创建了一个可重复使用的操作。要在我们的 ExampleController 中使用它,我们应该通过重写 action() 方法在操作映射中声明我们的操作。
步骤 2 − 以这种方式修改 ExampleController.php 文件。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public function actions() {
return [
'greeting' => 'app\components\GreetingAction',
];
}
public function actionIndex() {
$message = "index action of the ExampleController";
return $this->render("example",[
'message' => $message
]);
}
public function actionHelloWorld() {
return "Hello world!";
}
}
?>
actions() 方法返回一个数组,该数组的值是类名,键是操作 ID。
步骤 3 − 转到 http://localhost:8080/index.php?r=example/greeting。您将看到以下输出。
步骤 4 − 您还可以使用操作将用户重定向到其他 URL。将以下操作添加到 ExampleController.php。
public function actionOpenGoogle() {
// 将用户浏览器重定向到 http://google.com
return $this->redirect('http://google.com');
}
现在,如果您打开 http://localhost:8080/index.php?r=example/open-google,您将被重定向到 http://google.com。
操作方法可以接受参数,称为操作参数。它们的值是使用参数名称作为键从 $_GET 检索的。
步骤 5 − 将以下操作添加到我们的示例控制器。
public function actionTestParams($first, $second) {
return "$first $second";
}
步骤 6 −在 Web 浏览器的地址栏中输入 URL http://localhost:8080/index.php?r=example/testparams&first=hello&second=world,您将看到以下输出。
每个控制器都有一个默认操作。当路由仅包含控制器 ID 时,表示请求默认操作。默认情况下,操作为 index。您可以轻松地在控制器中覆盖此属性。
步骤 7 − 以这种方式修改我们的 ExampleController。
<?php
namespace app\controllers;
use yii\web\Controller;
class ExampleController extends Controller {
public $defaultAction = "hello-world";
/* other actions */
}
?>
步骤 8 −现在,如果您转到 http://localhost:8080/index.php?r=example,您将看到以下内容。
为了满足请求,控制器将经历以下生命周期 −
调用 yii\base\Controller:init() 方法。
控制器根据操作 ID 创建操作。
控制器依次调用 Web 应用程序、模块和控制器的 beforeAction() 方法。
控制器运行操作。
控制器依次调用 Web 应用程序、模块和控制器的 afterAction() 方法应用程序、模块和控制器。
应用程序将操作结果分配给响应。
要点
控制器应该 −
- 非常精简。每个操作应该只包含几行代码。
- 使用视图进行响应。
- 不嵌入 HTML。
- 访问请求数据。
- 调用模型的方法。
- 不处理请求数据。这些应该在模型中处理。

