Yii2基类控制器文件分析(yii\base\Controller.php)创建动作执行动作

本文详细分析了Yii2框架中baseController.php的核心功能,包括控制器的运行机制、action的创建与执行、路由处理、beforeAction和afterAction事件以及视图渲染。通过对run、runAction、createAction等关键方法的解读,揭示了Yii2控制器如何响应请求并执行相应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下Yii中的控制器是做什么用的,以及在什么地方使用.

在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager解析出route,再在Module中根据route来创建controller并处理request。
如:http://www.yii2.com/index.php?r=site/login。会使用SiteController里面的actionLogin动作来处理这个请求。

Yii中总共有三种控制器类
  • base\Controller.php       这个是下面两个的基类,即这里讲的控制器
  • console\Controller.php   这个是控制台控制器
  • web\Controller.php        这个是web控制器
先看看基类base\Controller.php,在基类中大致可分为三个部分
  • 和action相关的功能
  • 和render相关的功能
  • 其它功能
1、和action相关的函数

我们按照这些函数的调用顺序来一一说明

执行路由:public function run($route, $params = [])
  1. /*
  2. * route值即可以为当前controller中的action id,
  3. *
  4. * 也可为module id/controller id/action id/这种格式
  5. * 如果以“/”开头,将用application来处理,否则,用控制器所属模块来处理
  6. */
  7. public function run($route, $params = [])
  8. {
  9.         //先判断route中有没有“/”
  10.         $pos = strpos($route, '/');
  11.         if ($pos === false) {
  12.                 //如果没有“/”,则为action id,直接调用runAction来执行这个action。如:index
  13.             return $this->runAction($route, $params);
  14.         } elseif ($pos > 0) {
  15.                 //如果“/”在中间,由当前的模块来处理这个route。如:test/index
  16.             return $this->module->runAction($route, $params);
  17.         } else {
  18.                 //如果以“/”开头,则用当前的应用程序来处理这个route。如:/test/index;
  19.             return Yii::$app->runAction(ltrim($route, '/'), $params);
  20.         }
  21. }
执行动作:public function runAction($id, $params = [])
  1. /*
  2. * $id 为action的id,如定义的actionIndex,那么id就为Index。
  3. *
  4. */
  5. public function runAction($id, $params = [])
  6. {
  7.         //创建action
  8.         $action = $this->createAction($id);
  9.         if ($action === null) {
  10.             throw new InvalidRouteException('Unable to resolve the request: ' . $this->getUniqueId() . '/' . $id);
  11.         }

  12.         Yii::trace("Route to run: " . $action->getUniqueId(), __METHOD__);

  13.         if (Yii::$app->requestedAction === null) {
  14.             Yii::$app->requestedAction = $action;
  15.         }

  16.         $oldAction = $this->action;
  17.         $this->action = $action;

  18.         //用来保存当前控制器的所有父模块,顺序为由子模块到父模块
  19.         $modules = [];
  20.         $runAction = true;

  21.         /*
  22.          * 获取当前控制器的所属模块,并执行每个模块的beforeAction来检查当前的action是否可以执行,
  23.          * 注意:getModules返回的数组顺序为:从父模块到子模块,
  24.          * 所以在执行beforeAction的时候,先检查最外层的父模块,然后检查子模块。
  25.          *
  26.          * 然而在执行afterAction的时候,顺序就反过来了,先执行子模块,最后执行父模块。
  27.          *
  28.          */
  29.         foreac
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值