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

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

yii framework工作流1-【发出请求到执行action逻辑】  

2013-06-04 17:41:06|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1. entry script

Yii::createWebApplication($config)->run();

//首先创建CWebApplication对象
public static function createWebApplication($config=null)
        {
                return self::createApplication('CWebApplication',$config);
        }

public static function createApplication($class,$config=null)
        {
                return new $class($config);
        }
CWebApplication(应用)
//其次调用CWebApplication的run方法
//run方法中依次调用了onBeginRequest, processRequest, onEndRequest方法
public function run()
        {
                if($this->hasEventHandler('onBeginRequest'))
                        $this->onBeginRequest(new CEvent($this));
                $this->processRequest();
                if($this->hasEventHandler('onEndRequest'))
                        $this->onEndRequest(new CEvent($this));
        }

//在processRequest方法中
public function processRequest()
        {
//catchAllRequest用来系统维护时候使用,将所有查询通过一个controller进行处理
                if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))
                {
//如果catchAllRequest数组定义为'catchAllRequest'=>array('site/error','p1'=>'1','p2'=>'2')
//则$route='site/error'
                        $route=$this->catchAllRequest[0];
//catchAllRequest数组的其他部分则是参数
                        foreach(array_splice($this->catchAllRequest,1) as $name=>$value)
                                $_GET[$name]=$value;
                }
                else
//正常情况下会走这个分支,对于url进行解析,获取到对应的router
                        $route=$this->getUrlManager()->parseUrl($this->getRequest());
//最后运行对应的controller类
                $this->runController($route);
        }


配置文件中设置:
'catchAllRequest'=>array('site/error','p1'=>'1','p2'=>'2')


public function runController($route)
        {
                if(($ca=$this->createController($route))!==null)
                {
                        list($controller,$actionID)=$ca;
                        $oldController=$this->_controller;
                        $this->_controller=$controller;
//首先controller进行初始化
                        $controller->init();
//其次controller运行对应的action方法
                        $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)));
        }


<?php
$my_array = array("Dog","Cat","Horse");

list($a, $b, $c) = $my_array;
echo "I have several animals, a $a, a $b and a $c.";
?>


CController(控制器): public function run($actionID)
        {
                if(($action=$this->createAction($actionID))!==null)
                {
                        if(($parent=$this->getModule())===null)
                                $parent=Yii::app();
                        if($parent->beforeControllerAction($this,$action))
                        {
//运行action和filter
                                $this->runActionWithFilters($action,$this->filters());
                                $parent->afterControllerAction($this,$action);
                        }
                }
                else
                        $this->missingAction($actionID);
        }


public function createAction($actionID)
{

//如果actionID == ''
if($actionID==='')
$actionID=$this->defaultAction;
//避免调用actions方法,在这个逻辑中生成actionXXX
if(method_exists($this,'action'.$actionID) && strcasecmp($actionID,'s')) // we have actions method
return new CInlineAction($this,$actionID);
else
{

//
$action=$this->createActionFromMap($this->actions(),$actionID,$actionID);
if($action!==null && !method_exists($action,'run'))
throw new CException(Yii::t('yii', 'Action class {class} must implement the "run" method.', array('{class}'=>get_class($action))));
return $action;
}
}


public function runActionWithFilters($action,$filters)
{
if(empty($filters))

//runAction
$this->runAction($action);
else
{
$priorAction=$this->_action;
$this->_action=$action;
CFilterChain::create($this,$action,$filters)->run();
$this->_action=$priorAction;
}
}


public function runAction($action)
{
$priorAction=$this->_action;
$this->_action=$action;
if($this->beforeAction($action))
{

//运行action,包括参数
if($action->runWithParams($this->getActionParams())===false)
$this->invalidActionParams($action);
else
$this->afterAction($action);
}
$this->_action=$priorAction;
}


public function getActionParams()
{
return $_GET;
}

CAction(动作):

public function runWithParams($params)
{
$method=new ReflectionMethod($this, 'run');
if($method->getNumberOfParameters()>0)
return $this->runWithParamsInternal($this, $method, $params);
else
return $this->run();
}


protected function runWithParamsInternal($object, $method, $params)
{

//将parms数组中的内容,放到$ps中去,这个过程又叫action paramter binding
$ps=array();
foreach($method->getParameters() as $i=>$param)
{
$name=$param->getName();
if(isset($params[$name]))
{
if($param->isArray())
$ps[]=is_array($params[$name]) ? $params[$name] : array($params[$name]);
elseif(!is_array($params[$name]))
$ps[]=$params[$name];
else
return false;
}
elseif($param->isDefaultValueAvailable())
$ps[]=$param->getDefaultValue();
else
return false;
}

//调用方法
$method->invokeArgs($object,$ps);
return true;
}


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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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