yii框架源码分析之Yii::createWebApplication()->run() 执行过程分析

 
  
// index.php

Yii
:: createWebApplication() -> 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 ));
}

// CApplication.php

$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 );
}
// CApplication.php

$route = $this -> getUrlManager() -> parseUrl( $this -> getRequest());
// CApplication.php

$this -> getUrlManager()
$this -> getRequest()
// CWebApplication.php

public function getRequest()
{
return $this -> getComponent( ' request ' );
}
public function getUrlManager()
{
return $this -> getComponent( ' urlManager ' );
}
// CApplication.php

$this -> getComponent( ' request ' );
// CModule.php

public function getComponent( $id , $createIfNull = true )
{
if ( isset ( $this -> _components[ $id ]))
return $this -> _components[ $id ];
else if ( isset ( $this -> _componentConfig[ $id ]) && $createIfNull )
{
$config = $this -> _componentConfig[ $id ];
if ( ! isset ( $config [ ' enabled ' ]) || $config [ ' enabled ' ])
{
Yii
:: trace( " Loading \" $id \" application component " , ' system.CModule ' );
unset ( $config [ ' enabled ' ]);
$component = Yii :: createComponent( $config );
$component -> init();
return $this -> _components[ $id ] = $component ;
}
}
}
// CModule.php

$config = $this -> _componentConfig[ $id ];
$component = Yii :: createComponent( $config );
$component -> init();
return $this -> _components[ $id ] = $component ;
// CWebApplication.php

return $this -> getComponent( ' request ' );
// CHttpRequest.php

public function init()
{
parent
:: init();
$this -> normalizeRequest();
}
// CHttpRequest.php

$this -> normalizeRequest();
// CHttpRequest.php

protected function normalizeRequest()
{
// normalize request
if ( function_exists ( ' get_magic_quotes_gpc ' ) && get_magic_quotes_gpc ())
{
if ( isset ( $_GET ))
$_GET = $this -> stripSlashes ( $_GET );
if ( isset ( $_POST ))
$_POST = $this -> stripSlashes ( $_POST );
if ( isset ( $_REQUEST ))
$_REQUEST = $this -> stripSlashes ( $_REQUEST );
if ( isset ( $_COOKIE ))
$_COOKIE = $this -> stripSlashes ( $_COOKIE );
}

if ( $this -> enableCsrfValidation)
Yii
:: app() -> attachEventHandler( ' onBeginRequest ' , array ( $this , ' validateCsrfToken ' ));
}
// CApplication.php

return $this -> getComponent( ' urlManager ' );
// CUrlManager.php

public function init()
{
parent
:: init();
$this -> processRules();
}
// CUrlManager.php

$this -> processRules();
// CUrlManager.php

protected function processRules()
{
if ( empty ( $this -> rules) || $this -> getUrlFormat() === self :: GET_FORMAT)
return ;
if ( $this -> cacheID !== false && ( $cache = Yii :: app() -> getComponent( $this -> cacheID)) !== null )
{
$hash = md5 ( serialize ( $this -> rules));
if (( $data = $cache -> get(self :: CACHE_KEY)) !== false && isset ( $data [ 1 ]) && $data [ 1 ] === $hash )
{
$this -> _rules = $data [ 0 ];
return ;
}
}
foreach ( $this -> rules as $pattern => $route )
$this -> _rules[] = $this -> createUrlRule( $route , $pattern );
if ( isset ( $cache ))
$cache -> set(self :: CACHE_KEY , array ( $this -> _rules , $hash ));
}
// CApplication.php

$route = $this -> getUrlManager() -> parseUrl( $this -> getRequest());
// CUrlManager.php
// CUrlManager::parseUrl()


public function parseUrl( $request )
{
if ( $this -> getUrlFormat() === self :: PATH_FORMAT)
{
$rawPathInfo = $request -> getPathInfo();
$pathInfo = $this -> removeUrlSuffix( $rawPathInfo , $this -> urlSuffix);
foreach ( $this -> _rules as $rule )
{
if (( $r = $rule -> parseUrl( $this , $request , $pathInfo , $rawPathInfo )) !== false )
return isset ( $_GET [ $this -> routeVar]) ? $_GET [ $this -> routeVar] : $r ;
}
if ( $this -> useStrictParsing)
throw new CHttpException( 404 , Yii :: t( ' yii ' , ' Unable to resolve the request "{route}". ' ,
array ( ' {route} ' => $pathInfo )));
else
return $pathInfo ;
}
else if ( isset ( $_GET [ $this -> routeVar]))
return $_GET [ $this -> routeVar];
else if ( isset ( $_POST [ $this -> routeVar]))
return $_POST [ $this -> routeVar];
else
return '' ;
}
// CWebApplication.php

$this -> 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 )));
}
// CWebApplication.php

$ca = $this -> createController( $route )
// CWebApplication.php

public function createController( $route , $owner = null )
{
if ( $owner === null )
$owner = $this ;
if (( $route = trim ( $route , ' / ' )) === '' )
$route = $owner -> defaultController;
$caseSensitive = $this -> getUrlManager() -> caseSensitive;

$route .= ' / ' ;
while (( $pos = strpos ( $route , ' / ' )) !== false )
{
$id = substr ( $route , 0 , $pos );
if ( ! preg_match ( ' /^\w+$/ ' , $id ))
return null ;
if ( ! $caseSensitive )
$id = strtolower ( $id );
$route = ( string ) substr ( $route , $pos + 1 );
if ( ! isset ( $basePath )) // first segment
{
if ( isset ( $owner -> controllerMap[ $id ]))
{
return array (
Yii
:: createComponent( $owner -> controllerMap[ $id ] , $id , $owner === $this ? null : $owner ) ,
$this -> parseActionParams( $route ) ,
);
}

if (( $module = $owner -> getModule( $id )) !== null )
return $this -> createController( $route , $module );

$basePath = $owner -> getControllerPath();
$controllerID = '' ;
}
else
$controllerID .= ' / ' ;
$className = ucfirst ( $id ) . ' Controller ' ;
$classFile = $basePath . DIRECTORY_SEPARATOR . $className . ' .php ' ;
if ( is_file ( $classFile ))
{
if ( ! class_exists ( $className , false ))
require ( $classFile );
if ( class_exists ( $className , false ) && is_subclass_of ( $className , ' CController ' ))
{
$id [ 0 ] = strtolower ( $id [ 0 ]);
return array (
new $className ( $controllerID . $id , $owner === $this ? null : $owner ) ,
$this -> parseActionParams( $route ) ,
);
}
return null ;
}
$controllerID .= $id ;
$basePath .= DIRECTORY_SEPARATOR . $id ;
}
}
// CWebApplication.php

$oldController = $this -> _controller;
$this -> _controller = $controller ;
$controller -> init();
$controller -> run( $actionID );
$this -> _controller = $oldController ;
// CWebApplication.php

$controller -> run( $actionID );
// CController.php

public function run( $actionID )
{
if (( $action = $this -> createAction( $actionID )) !== null )
{
if (( $parent = $this -> getModule()) === null )
$parent = Yii :: app();
if ( $parent -> beforeControllerAction( $this , $action ))
{
$this -> runActionWithFilters( $action , $this -> filters());
$parent -> afterControllerAction( $this , $action );
}
}
else
$this -> missingAction( $actionID );
}

转载自 jKey Blog 

本文链接地址: http://blog.jkey.lu/yii-createwebapplication-run/

转载于:https://www.cnblogs.com/codelifezj/archive/2011/06/29/2092922.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值