前言其实一开始我很纠结要不要写controller的源码分析,因为controller的源码太少了,所以一点你不相信它是MVC中的一个沉重的头。直觉上大家认为controller是每个请求的“入口”,它的后端应该有很多代码支持。然而,事实恰恰相反。去掉注释后,总共只有60行左右。在controller之前在看controller的源码之前,我们还是要回顾一下controller是怎么来的。请看一下屏幕截图。截图中有两个方法:createController和runController。createController负责实例化路由找到的控制器类。在实例化的时候,可以看到request和response作为参数传递给controller的constructor,这就是为什么在定义controller的时候,如果定义了__construct方法,一定要记得调用parent::__construct(),因为它默认定义的__construct方法会覆盖父类的__construct,所以必须显式调用父类的构造函数来执行。runController就是执行controller进程。大致思路就是拿刚才实例的对象,执行路由中找到的controller方法。并返回输出。严格来说,这是控制器父类的源代码。定义了一些常用的方法让controller运行,比如post参数校验,缓存等,下面详细说说:第11-16行:controller父类的属性,可以定义controller的状态本身。这些属性可以在您定义的类中被覆盖。helpers定义要加载的helper方法,当forceHTTPS大于0时,可以指定在当前设置值期间强制为https。验证器定义要验证的帖子内容的规则。第18-29行:控制器父类的构造方法。如果在定义controller的时候没有定义自己的构造方法,默认会执行这个方法。如果它被定义,这个方法将被覆盖。需要在构造方法Executeparent::__construct()的最前面,保证该方法中的初始化数据能够正常初始化。forceHTTPS方法是强制使用https协议,loadHelpers可以默认自动加载需要的helpers。第51-60行:validate方法,主要辅助验证post请求的各个字段。形式如下:if(!$this->validate($this->request,['email'=>"required|is_unique[users.email,id,{$userID}]",'name'=>'required|alpha_numeric_spaces'])){returnview('users/update',['errors'=>$this->errors]);}//如果成功就在这里做点什么...以上源码截取自CI4官方手册。如果觉得验证规则比较乱,可以在ConfigValidation.php中自定义一个验证组,通过以下方式进行验证:$this->validate($this->request,'userRules')在controller之后,我们都知道control控制器会和view端交互。在之前的CI版本中,controller会将view加载到自己的生命周期中,直接处理请求信息。我个人也认为这对控制器的地位来说有点太重了。在CI4中,controller只负责接收view返回的组装好的页面字符串,返回给codeigniter的核心,由核心来处理后续的事情。结语本节简单说一下控制器的父类。源码比较少,就不多说了。下一节尝试谈谈观点。本文可转载,但转载前需发邮件至imustgxd*sina.cn进行交流,未交流的视为侵权。转载时必须同时注明链接,并保留该段文字。
