控制器介绍
本章节主要是介绍,控制器文件代码的结构和含义,并能通过控制器输出简单的“hello world”。本章节的内容建立在您已经熟悉《环境配置》《下载安装》,能安装起标准站点并正常访问的基础之上。如不熟悉,请先阅读前两节内容。
一、术语解读
控制器是MVC模式中的一部分,负责处理请求和生成响应。 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息,我们编写一个页面,首页就是从控制器开始。 控制器由 操作组成,或者称为动作,一个控制器,可以有一个或多个操作(动作),如下代码就是包含了两个动作viewcreate 的控制器(Post), 或许您也注意到了,控制器名和操作(动作)方法名第一个字母都是大写的。控制器文件一般位于每个应用(站点的)controllers/目录下,每个文件分别代表一个控制器。
// PostController.php
class PostController extends Controller {
    public function actionCreate() {
        ...
    }
    public function actionView() {
        ...
    }
}
注意: 操作方法的名字大小写敏感,如果方法名称为ActionIndex不会认为是操作方法, 所以请求index操作会返回一个异常
二、控制器路径
我们通过访问地址(路由)就能很快的找到控制器文件路径在哪,执行了哪个操作方法。请注意,控制器文件名中的Controller是保留字,且首字母大写。 以下就是几个简单的例子:

1、post/index.htmlindex.php?r=post/index

控制器ID为post操作方法为index,对应文件为:/controllers/PostController.php 里面的 actionIndex 方法

2、post/view.html?id=1index.php?r=post/view&id=1

控制器ID为post操作方法为view,对应文件为:/controllers/PostController.php 里面的 actionView 方法,参数为id=1

3、admin/user/list.htmlindex.php?r=admin/user/list

控制器ID为admin/user操作方法为list,对应文件为:/controllers/admin/UserController.php 里面的 actionList 方法

注意:目前系统默认配置为静态地址,即以.html为后缀的路由。可以通过修改common/config/main.php的urlManager组件,将参数enablePrettyUrl修改为false关闭 路由美化功能,但 不建议您这样做。有关路由的更多介绍,请查看路由章节
三、代码解读
我们还是以例子来说明一个控制器包含的重要代码结构和含义,首先,我们打开前台(PC)端首页控制器文件,文件路径为:@shopwind\frontend\api\controllers\DefaultController.php(建议使用开发工具:VS Code来编辑代码),对于一个简单的控制器来讲 ,实际上它只需要以下几行代码就可以正常运行:
namespace frontend\controllers\home;
use Yii;
class DefaultController extends \common\base\BaseMallController {       
    public function actionIndex() 
    {
        echo "hello world";
    }
}
如果我们在浏览器输入地址:http://localhost/shopwind/frontend/web/default/index.html则会在页面上打印出“hello world”字符。我们来看一下关键的代码:

1、第一行是命名空间,frontend\controllers\home代表了该控制器文件所在的目录。

2、第二行是引入Yii,Yii是系统底层的一个基类,我们在后面的章节会继续讲到该类的使用。(实际上这行代码对该控制器文件来讲,可有可无)。

3、第三行是定义类名,DefaultController是控制器的类名,这个必须要保证跟控制器的文件名保持一致,这样才能实现懒加载。然后该控制器类extends(继承)一个父类\common\base\BaseMallController,接下来就是实现一个public类型的操作方法 actionIndex 我们在操作方法内就可以编写自己需要实现的功能,比如输出一个字符串,显示一个视图文件,执行某个逻辑等。

注意:action是保留字,全部是小写字母。控制器名和操作方法名首字母要大写。

四、关于控制器父类
刚才我们的举的例子,DefaultController控制器继承了一个父类\common\base\BaseMallController,目前系统提供了四个控制器父类,控制器父类位于:@shopwid/common/controllers/目录下,分别为:

1、BaseMallController代表的是Web应用商城基类,该类直接继承Yii的\yii\web\Controller类。商城基类会做一些请求的初始化操作,或者控制器的公共操作,如:安装判断,视图初始化,访客初始化等,还有公共actions也是部署在该类。

2、BaseUserController代表的是商城用户基类,该类继承BaseMallController类。当我们的控制器需要用户登录才能访问的可以继承此类。该父类会完成一些用户验证方面的操作。

3、BaseSellerController代表的是商城卖家基类,该类继承BaseUserController类。当我们的控制器需要卖家身份才能访问的可以继承此类。该父类会完成一些卖家身份验证方面的操作。

4、BaseAdminController代表的是商城后台管理员基类,该类继承BaseMallController类。当我们的控制器需要是后台管理员身份才能访问的可以继承此类。该父类会完成一些后台管理员身份验证方面的操作。

有了控制器父类,我们就可以将一些通用的操作放到父类去执行,比如视图初始化、用户登录验证等,避免了重复代码。
有关控制器的更多问题,可以参考Yii2的控制器:Yii2控制器介绍了解更多内容,也可以访问我们的 开发者社区反馈,我们会有官方技术人员在线解答。