yii框架详解 之 CWebApplication 运行流程分析

在 程序入口处,index.php 用一句 Yii::createWebApplication($config)->run();  开始了app的运行。

那么,首先查看 CWebApplication 的 构造函数,如下:

public function __construct($config=null)

{

Yii::setApplication($this);

// set basePath at early as possible to avoid trouble

if(is_string($config))

$config=require($config);

if(isset($config[‘basePath‘]))

{

$this->setBasePath($config[‘basePath‘]);

unset($config[‘basePath‘]);

}

else

$this->setBasePath(‘protected‘);

Yii::setPathOfAlias(‘application‘,$this->getBasePath());

Yii::setPathOfAlias(‘webroot‘,dirname($_SERVER[‘SCRIPT_FILENAME‘]));

Yii::setPathOfAlias(‘ext‘,$this->getBasePath().DIRECTORY_SEPARATOR.‘extensions‘);

$this->preinit();

$this->initSystemHandlers();

$this->registerCoreComponents();

$this->configure($config);

$this->attachBehaviors($this->behaviors);

$this->preloadComponents();

$this->init();

}

再来看下,run()函数的流程:

public function run()

{

if($this->hasEventHandler(‘onBeginRequest‘))

$this->onBeginRequest(new CEvent($this));

register_shutdown_function(array($this,‘end‘),0,false);

$this->processRequest();

if($this->hasEventHandler(‘onEndRequest‘))

$this->onEndRequest(new CEvent($this));

}

最后看框架是如何处理请求的:

public function processRequest()

{

if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))

{

$route=$this->catchAllRequest[0];

foreach(array_splice($this->catchAllRequest,1) as $name=>$value)

$_GET[$name]=$value;

}

else

$route=$this->getUrlManager()->parseUrl($this->getRequest());

$this->runController($route);

}

由此可知,在 框架中的配置文件中,指定的 preload 组件,会在处理请求和路由分析之前执行,那么通过preload机制,我们能做的事就很多了,

比如:

想动态加载一些路由测略时,就可以自定义组件,先行于 processRequest进程,在自己的组件里 $this->getUrlManager()->addRules()。

值得一提的是,Yii里的组件是单例模式,先判断有没有已经存在,再去实例化组件,这使得在各个地方调用的组件延续性很好。

来自为知笔记(Wiz)

时间: 2024-10-10 10:17:23

yii框架详解 之 CWebApplication 运行流程分析的相关文章

yii框架详解 之 CActiveRecord

[特别注意事项] 1.所有要用于访问的属性,都要先在类中声明(原数据表中的字段是默认可访问的,自定义的属性值,一定要先在类中添加声明,才可以正常访问) 2.数据库的表面引用,一般都是有固定的数据库表前缀的,在类中,使用 {{tableName}} 代表着 table_pre.tableName 3.model()方法是 static 方法,不用实例化即可直接使用,多用于查询. 4.rules() 方法 是用来验证字段合法性的,而且可以设置每个规则的应用环境标示,如 'on'=>'search',

yii框架详解 之 国际化 (I18N)

我们要开启组件中们关于语言的配置,默认的就是CPhpMessageSource,也可以改为其他的方式. #组件配置中 'messages' => array( 'class'=>'CPhpMessageSource', ), Yii 含有如下几种信息源.你也可以扩展 CMessageSource 创建自己的信息源类型. CPhpMessageSource: 信息的翻译存储在一个 PHP 的 键值对 数组中. 原始信息为键,翻译后的信息为值.每个数组表示一个特定信息分类的翻译,分别存储在不同的

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

(转) shiro权限框架详解06-shiro与web项目整合(上)

http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springMVC+mybatis,所以我们是基于搭建好的项目进行改造的. 将shiro整合到web应用中 登录 退出 认证信息在页面展现,也就是显示菜单 shiro的过滤器 将shiro整合到web应用中 数据库脚步 sql脚步放到项目中,项目上传到共享的资源中,文章最后给出共享url. 去除项目中不使用shi

Java并发编程之---Lock框架详解

Java 并发开发:Lock 框架详解 摘要: 我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等.Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题.本文以synchronized与Lock的对比为切入点,对Java中的Lock框架的枝干部分进行了详细介绍,最后给出了锁的一些相关概念. 一

(转) IOS ASI http 框架详解

(转) IOS ASI http 框架详解 ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互. ASIHTTPRequest功能很强大,主要特色如下: l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作 l 下载的数据,可存储到内存中或直接存储到磁盘中 l 能上传

MTK平台LCD驱动框架详解(二)

前篇博客链接:http://blog.csdn.net/xuan_h/article/details/38519975 上篇博文说到了mtkfb_probe函数,本文在说mtkfb_probe函数之前.我还是打算在从应用程序的调用开始分析下具体的调用过程.这是我们理解驱动框架的核心,而并不是简单的接受. 一.驱动核心Fbmem.c(alps\kernel\drivers\video\Fbmem.c)分析 下面先摘取一部分源码,源码包括:入口函数.fb_fops.fb_fops中的open函数.用

SLF4J和Logback日志框架详解

SLF4J和Logback日志框架详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 本文讲述SLF4J和Logback日志框架.   SLF4J是一套简单的日志外观模式的Java API,帮助在项目部署时对接各种日志实现. LogBack在运行时使用JMX帮助修改日志配置,在生产状态下无需重启应用程序. SLF4J SLF4J是简单的日志外观模式框架,抽象了各种日志框架例如Logback.Log4j.Commons-logging和JDK自带的l

eclipse Indigo搭建SSH框架详解

SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作.   下载好eclipse,Struts2,Spring,Hibernate.   1.eclipse:eclipse下载的时候建议下载JavaEE版的eclipse.                 当然你也可以下载eclipse-SDK.(下载eclipse-SDK需要下载Web,Tomcat等plugins)   2.Struts2:http://str