注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zjcjack的博客

 
 
 

日志

 
 

yiiframework载入流程  

2012-02-24 00:23:20|  分类: YII框架 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

对一个程序或者框架来说,如果不分析它的运行流程,那么我心里总是不踏实。于是想分析一下yiiframework。但是为了防止重复造轮子,就google一下,结果发现了这个。特意转载过来,原文链接在这里。严格说,这不是运行流程,仅仅分析到run,而run之后发生的事情才是真正需要的,所以我把名字修改为“载入流程”。

这是官方的一副流程图.

image

当一次请求被处理的时候~程序先调用了project/index.php文件,里面有如下几行代码:

// change the following paths if necessary
$yii=dirname(__FILE__)./../yii/framework/yii.php;
$config=dirname(__FILE__)./protected/config/main.php;
// remove the following line when in production mode
defined(YII_DEBUG) or define(YII_DEBUG,true);
require_once($yii);
Yii::createWebApplication($config)->run();

这段代码首先讲yii.php文件和main.php文件放入2个变量中,然后设置了YII_DEBUG变量为true,接着require_once了yii.php文件,并调用了run()方法.

yii.php文件有如下代码:

require(dirname(__FILE__)./YiiBase.php);
class Yii extends YiiBase
{
}

这段代码导入了yiibase.php,并定义了类Yii,该类继承YiiBase.

main.php里面是各种配置的信息,将配置信息作为数组返回.
Yii继承YiiBase,于是又找到YiiBase.php文件,发现这个文件开始的时候定义了如下几个变量:YII_BEGIN_TIME,YII_DEBUG,YII_ENABLE_EXCEPTION_HANDLER,YII_ENABLE_ERROR_HANDLER 和YII_BATH.
找到createWebApplication方法,里面就一条语句:

return new CWebApplication($config);

于是又找到yii/framework/web/CWebApplication.php文件,但是却没有在里面找到构造函数,由于该类继承 CApplication,又找到yii/framework/base/CApplication.php,这个类里有构造函数,内容如下:

1public function __construct($config=null)
2{
3Yii::setApplication($this);
4
5// set basePath at early as possible to avoid trouble
6if(is_string($config))
7$config=require($config);
8if(isset($config['basePath']))
9{
10$this->setBasePath($config['basePath']);
11unset($config['basePath']);
12}
13else
14$this->setBasePath(protected);
15Yii::setPathOfAlias(application,$this->getBasePath());
16Yii::setPathOfAlias(webroot,dirname($_SERVER['SCRIPT_FILENAME']));
17
18$this->preinit();
19
20$this->initSystemHandlers();
21$this->registerCoreComponents();
22
23$this->configure($config);
24$this->attachBehaviors($this->behaviors);
25$this->preloadComponents();
26
27$this->init();
28}
29
第一句Yii::setApplication($app);调用YiiBase里的setApplication()方法,该方法内容如下:
public static function setApplication($app)
{
if(self::$_app===null || $app===null)
self::$_app=$app;
else
throw new CException(Yii::t(yii,Yii application can only be createdonce.));
}

这个方法的目的是实例化一个app对象.
第6行到第14行设定了config和basePath.第15句和第16句设定了2个路径的快捷方式, webroot和application.
第18行调用了preinit()方法,该方法在该类中没有,是该类的父类CModule里的,但是找到yii/framework/base/CModule.php后,发现该方法内容为空.
第20行调用了initSystemHandlers,该方法位于该类中,内容如下:

protected function initSystemHandlers()
{
if(YII_ENABLE_EXCEPTION_HANDLER)
set_exception_handler(array($this,handleException));
if(YII_ENABLE_ERROR_HANDLER)
set_error_handler(array($this,handleError),error_reporting());
}

第21行调用了registerCoreComponents方法,该方法内容如下:

protected function registerCoreComponents()
{
$components=array(
coreMessages=>array(
class=>CPhpMessageSource,
language=>en_us,
basePath=>YII_PATH.DIRECTORY_SEPARATOR.messages,
),
db=>array(
class=>CDbConnection,
),
messages=>array(
class=>CPhpMessageSource,
),
errorHandler=>array(
class=>CErrorHandler,
),
securityManager=>array(
class=>CSecurityManager,
),
statePersister=>array(
class=>CStatePersister,
),
);
$this->setComponents($components);
}

第23行调用了configure方法,该方法在父类CModule里,内容如下:

public function configure($config)
{
if(is_array($config))
{
foreach($config as $key=>$value)
$this->$key=$value;
}
}

第24行调用了attachBehaviors方法,该方法位于父类CModule的父类CComponent类中,内容如下:

public function attachBehaviors($behaviors)
{
foreach($behaviors as $name=>$behavior)
$this->attachBehavior($name,$behavior);
}

第25行调用了preloadComponents方法,该方法同样位于父类CModule里,内容如下:

protected function preloadComponents()
{
foreach($this->preload as $id)
$this->getComponent($id);
}

第27行调用了init方法,该方法位于父类CModule方法中,内容为空.
至此Yii::createWebApplication($config)方法已经分析完成~剩下的就是run()方法了.

1public function run()
2{
3$this->onBeginRequest(new CEvent($this));
4$this->processRequest();
5$this->onEndRequest(new CEvent($this));
6}

看完了,却没有太多收获……

  评论这张
 
阅读(320)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017