1. 我们可以看入口文件index.php
#index.php
// change the following paths if necessary
$yii=dirname(__FILE__).'/../framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
require_once($yii);
Yii::createWebApplication($config)->run();


* Yii::createWebApplication($config)->run(); 这个是我们比较感兴趣的, Yii在哪里? ===> YiiBase.php, createWebApplication这个静态方法也是

*Yii::createWebApplication($config) => 表示创建一个Appcication实例,它做什么?
  1. 看看YiiBash.php
#YiiBash.php
	public static function createWebApplication($config=null)
	{
		return self::createApplication('CWebApplication',$config);
	}

	public static function createApplication($class,$config=null)
	{
		return new $class($config); //==> new CWebApplication()
	}

以上表示创建WebAPP实例, 以后的战场就在这里进行咯,这个跟ROR,或者iPhone或者其他框架都相似吧**
**
但是创建这个实例的时候,初始化做了什么事情呢?我们往下看

  1. 到了CApplication.php
#CApplication.php
public function __construct($config=null)
	{
		Yii::setApplication($this); // 这个作用就是以后你就可以使用 Yii::app()->user //还记得我说app是战场么?

		// 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();
	}

*$this->registerCoreComponents(); 这个很重要,因为要实例的是CWebApplication,所以请回到CWebApplication.php

  1. CWebApplication.php
protected function registerCoreComponents()
	{
		parent::registerCoreComponents();

		$components=array(
			'session'=>array(
				'class'=>'CHttpSession',
			),
			'assetManager'=>array(
				'class'=>'CAssetManager',
			),
			'user'=>array(
				'class'=>'CWebUser',
			),
			'themeManager'=>array(
				'class'=>'CThemeManager',
			),
			'authManager'=>array(
				'class'=>'CPhpAuthManager',
			),
			'clientScript'=>array(
				'class'=>'CClientScript',
			),
		);

		$this->setComponents($components);
	}

注意$this->setComponents($components); ==> 这个方法在CModule.php

  • registerCoreComponents 方法实现了注册Core components, 但是不实现,后面的 $this->setComponents($components);就表示实实例这些components了, 所以一个WebAPP,初始化的时候应该可以使用: session, assetManager, user, themeManager, clientScript 这几个实例, 通过Yii:app()->session调用,如果要在启动一个WebAPP的时候初始化一个对象,请在main.php配置

好了,这个是一个WebAPP初始化要做的事情: 路径,配置文件,Handlers,Behaviors,Componts等

  1. 接下来就是要做run()
#CApplication.php

	public function run()
	{
		if($this->hasEventHandler('onBeginRequest'))
			$this->onBeginRequest(new CEvent($this));
		$this->processRequest();
		if($this->hasEventHandler('onEndRequest'))
			$this->onEndRequest(new CEvent($this));
	}

*先进行onBeginRequest => processRequest => onEndRequest //相信这个些英文单词都很好理解了

  1. 我们重点看$this->processRequest()
#CWebApplication.php
	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);

*1.处理URL的部分,知道哪部分是Controller, 哪部分是Action等,这个部分由urlManager来处理
*重要的在这里: $this->runController($route)

  1. 看看runController($route)
#CWebApplication.php
public function runController($route)
	{
		if(($ca=$this->createController($route))!==null)
		{
			list($controller,$actionID)=$ca;
			$oldController=$this->_controller;
			$this->_controller=$controller;
			$controller->init();
			$controller->run($actionID);
			$this->_controller=$oldController;
		}
		else
			throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
				array('{route}'=>$route===''?$this->defaultController:$route)));
	

*以上当然是创建一个controller的实例,然后执行一个action方法, 这个时候,WebApp环境又多了一个controller的实例

所有流程就是这样了,当然错漏很难免,但请赐教;-)

转载请注明:韦旭红的点点滴滴 » Yii的工作流程小解(原创)