热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Yii2源码分析入口文件执行流程

Yii2源码分析入口文件执行流程1.入口文件:webindex.php,第12行。(newyii\web\Application($config)-run())入口文件主要做4件

Yii2 源码分析  入口文件执行流程

 


1. 入口文件:web/index.php,第12行。(new yii\web\Application($config)->run())


  入口文件主要做4件事:

  1. 设置环境
  2. 加载自动加载
  3. 引入Web需要的配置
  4. 运行应用Application


1 php
2
3 // comment out the following two lines when deployed to production
4 defined(YII_DEBUG) or define(YII_DEBUG, true);
5 defined(YII_ENV) or define(YII_ENV, dev);
6
7 require __DIR__ . /../vendor/autoload.php;
8 require __DIR__ . /../vendor/yiisoft/yii2/Yii.php;
9
10 $cOnfig= require __DIR__ . /../config/web.php;
11
12 (new yii\web\Application($config))->run();

 


2. 接下来看运行应用Application做了哪些事情  


  1. 执行应用类的构造方法:__construct()

    a. 设置全局应用对象:Yii::$app
    b. 加载配置,检查配置是否正常配置并设置全局配置参数:如,检查应用id是否设置,检查basePath是否设置,检查缓存目录...,并设置对应的应用属性参数
    c. 注册全局错误异常处理机制
    d. 设置配置中对应对象的属性  


189 /**
190 * Constructor.
191 * @param array $config name-value pairs that will be used to initialize the object properties.
192 * Note that the configuration must contain both [[id]] and [[basePath]].
193 * @throws InvalidConfigException if either [[id]] or [[basePath]] configuration is missing.
194 */
195 public function __construct($cOnfig= [])
196 {
197 Yii::$app = $this;
198 static::setInstance($this);
199
200 $this->state = self::STATE_BEGIN;
201
202 $this->preInit($config);
203
204 $this->registerErrorHandler($config);
205
206 Component::__construct($config);
207 }


  2. 执行init()方法,执行引导:bootstrap

    a. 注册Yii扩展的组件,组件目录位于:根目录\vendor\yiisoft\extension/php
    b. 注册用户自定义配置文件main.php中属性boostrap配置的容器配置


267 /**
268 * {@inheritdoc}
269 */
270 public function init()
271 {
272 $this->state = self::STATE_INIT;
273 $this->bootstrap();
274 }


  3. 执行run()方法,执行应用请求流程,Yii处理请求逻辑应用的方法入口,应用的生命周期及对应的行为、事件处理函数等入口  


374 /**
375 * Runs the application.
376 * This is the main entrance of an application.
377 * @return int the exit status (0 means normal, non-zero values mean abnormal)
378 */
379 public function run()
380 {
381 try {
382 $this->state = self::STATE_BEFORE_REQUEST;
383 $this->trigger(self::EVENT_BEFORE_REQUEST);
384
385 $this->state = self::STATE_HANDLING_REQUEST;
386 $respOnse= $this->handleRequest($this->getRequest());
387
388 $this->state = self::STATE_AFTER_REQUEST;
389 $this->trigger(self::EVENT_AFTER_REQUEST);
390
391 $this->state = self::STATE_SENDING_RESPONSE;
392 $response->send();
393
394 $this->state = self::STATE_END;
395
396 return $response->exitStatus;
397 } catch (ExitException $e) {
398 $this->end($e->statusCode, isset($response) ? $response : null);
399 return $e->statusCode;
400 }
401 }

 


解析Yii执行run()的生命周期,在这个方法中可以看到有一些$this->state变量设置,这个变量主要用来记载Yii应用请求处于每个阶段的处理过程,例如上面的__construct(),init(),以及run()都相应的设置了Yii全局应用请求的状态


其中有:STATE_BEGIN(应用实例化阶段)、STATE_INIT(执行init方法初始化阶段)、STATE_BEFORE_REQUEST(执行请求前阶段)、STATE_HANDLING_REQUEST(处理请求中阶段)、STATE_AFTER_REQUEST(执行请求后阶段)、STATE_SENDING_RESPONSE(返回响应阶段)、STATE_END(应用结束输出阶段)


这里主要来分析run()方法中第385行:$respOnse= $this->handleRequest($this->getRequest()); 处理请求中阶段:

1. 获取请求并传递给handRequest处理请求方法,handleRequest方法位于:\vendor\yiisoft\yii2\web\Application文件中
2. Application文件第80-99行,解析请求URL地址,获取请求路径,地址参数:82行 list($route, $params) = $request->resolve();
3. Application文件第100-116行,根据请求路径及参数,创建路径指向的路由控制器文件,执行方法并传入参数:103行 $result = $this->runAction($route, $params);
  a. \vendor\yiisoft\yii2\base\Module::runAction($route, $params),找到路由文件地址:522行 $parts = $this->createController($route)
  b. 分析路由控制器,及请求方法:list($controller, $actionID) = $parts
  c. 设置全局控制器
  d. 执行控制器中的方法体并传入参数:528行 $result = $controller->runAction($actionID, $params)
    I. \vendor\yiisoft\yii2\base\Controller::runAction($id, $params = []),第126-138行,方法体创建过程
      i. 创建方法体对象:创建方法体对象 第219行 createAction($id)
      ii. 正则匹配请求方法名是否符合规范
      iii. 方法名转化,以‘-‘切割,转换大小写
      iiii. 为方法名添加‘action‘前缀
      iiiii. 验证该方法名是否存在该类中
      iiiiii. 检查该方法是否属于公共方法
      iiiiiii. 执行方法体前  
    II. 执行模块前置行为(全局行为处理)
    III. 执行方法体前置行为(这里可验证方法权限、参数、跨域等行为)
    IIII. 执行方法体【业务逻辑,这里就是我们编写代码逻辑controller::action】
    IIIII. 执行方法体后置行为(这里可对返回数据进行验证处理)
    IIIIII. 执行模块后置行为(全局行为处理)
    IIIIIII. 获取以上执行方法体以及模块行为事件处理的最终结果并返回:第172行

 


这里分析下Yii怎么解析路由文件,执行路径:web\Application::handleRequest->runAction()103行 => base\Module::runAction->createController()522行 =>base\Module::createController()562行:

1. 解析地址,以‘/‘切割,根据route路由地址解析出id模块以及操作控制器路由地址route 第564-579行
2. 加载模块id对应的模块配置 第582-589行
3. 根据控制器路由地址,加载控制器文件 第591-602行,主要代码:$cOntroller= $this->createControllerByID($id . ‘/‘, $route) 598行
  a. 检查类文件及类前缀路径是否符合规范 vendor\yiisoft\base\Module::629行
  b. 加载模块完,加载控制器,检查类文件是否存在,控制器地址文件不存在则报错404
  c. 加载容器的时候,自动给方法加上controller vendor\yiisoft\base\Module.php::635行
  d. 匹配正确的文件,实例化控制器 vendor\yiisoft\base\Module.php::642行
4. 返回对应的类实例化及操作方法到执行前创建控制器 vendor\yiisoft\yii2\base\Module::522行
5. 检查返回是否符合数组(控制器实例及操作方法),否:页面找不到
6. 设置App应用全局控制器 vendor\yiisoft\yii2\base\Module::527行
7. 传递参数到控制器并执行控制器方法 vendor\yiisoft\yii2\base\Module::528行

 


推荐阅读
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
66代码
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有