`

Yii分析4:run的执行

阅读更多

在创建完了一个Application之后,就是通过run方法来“运行”这个应用程序了:
$app = Yii::CreateWebApplication($config); 
$app->run(); 

下面,我们就来看看,run这个方法是怎么执行的,首先run方法并不是在一个具体的application(比如CWebApplication)中定义的,而是在他们的父类CApplication中定义的,代码如下:

 

public function run()
{
	//触发一个请求开始前的事件
        $this->onBeginRequest(new CEvent($this));
		//处理具体的请求
        $this->processRequest();
		//触发请求完成之后的事件
        $this->onEndRequest(new CEvent($this));
}

 public function onBeginRequest($event)                                        
{
    $this->raiseEvent('onBeginRequest',$event);                               
}  

 基于《Yii分析2:组件的事件机制》的分析,我们知道这里其实是在调用一个onBeginRequest的方法,而这个方法从哪里来呢,回到《Yii分析1:web程序入口(2)》 ,在CreateApplication时,注册了一个组件request,也就是CHttpRequest,这个组件的初始化代码如下:

/**                                                                           
     * Initializes the application component.                                     
     * This method overrides the parent implementation by preprocessing           
     * the user request data.                                                     
     */                                                                           
    public function init()                                                        
    {                                                                             
        parent::init();                                                           
        $this->normalizeRequest();                                                
    }    
    /**                                                                           
     * Normalizes the request data.                                               
     * This method strips off slashes in request data if get_magic_quotes_gpc() returns true.
     * It also performs CSRF validation if {@link enableCsrfValidation} is true.  
     */
    protected function normalizeRequest()                                         
    {
        // normalize request                                                      
        if(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);
        }
		//enableCsrfValidation初始值为false,因此onBeginRequest并没有在CWebApplication中注册
        if($this->enableCsrfValidation)
			//注册事件处理函数
            Yii::app()->attachEventHandler('onBeginRequest',array($this,'validateCsrfToken'));
    }

 接下来是核心的“处理请求”的过程了,我们来看一下CWebApplication的代码:

   /**
	 * Processes the current request.
	 * It first resolves the request into controller and action,
	 * and then creates the controller to perform the action.
	 */
	public function processRequest()
	{
		//catchAllRequest用于yiilite,yiilite的使用请查看(http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.performance)
		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
			//使用路由管理器来解析url,返回路由的信息
			$route=$this->getUrlManager()->parseUrl($this->getRequest());
		//将路由信息作为参数传给runController来运行相应的Controller
		$this->runController($route);
	}
 

run的执行就分析到这里,路由管理类和runcontroller我会再分两篇文章进行分析。

分享到:
评论

相关推荐

    Yii框架执行流程及部分源码分析

    让我们深入了解一下Yii框架的执行流程及其部分源码分析。 1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时...

    Yii_PHP_框架分析

    `CWebApplication` 的实例化后,其 `run()` 方法会被调用,开始执行整个 Web 应用的生命周期。 4. **CWebApplication 继承结构** `CWebApplication` 是一个Web 应用的核心组件,负责处理 HTTP 请求,管理路由,...

    Yii_PHP_框架源码分析.pdf

    接着,使用Yii::createWebApplication函数创建了一个CWebApplication对象,并执行其run方法启动框架。 Yii类是YiiBase类的完全继承,它的成员和方法都是静态类型的。Yii类提供了许多静态方法,例如...

    PhpStorm6 创建yii framework项目

    4. 项目配置:根据Yii框架的项目结构,可能还需要做一些配置工作,比如数据库连接、环境设置等。在PhpStorm中,我们可以通过运行环境的配置来实现,这通常在“Run/Debug Configurations”中进行设置。 5. 开发和...

    YII Framework的filter过滤器用法分析

    YII框架中的filter过滤器是该框架提供的一个强大功能,它允许开发者在控制器动作执行之前或之后执行一段自定义的代码,用以完成如访问控制、性能监控、数据验证等任务。过滤器的实现方式可以是通过控制器类中的特定...

    Yii框架反序列化RCE利用链分析1

    然而,通过创建一个具有可执行命令的公共方法的类,例如`yii2/rest/IndexAction`的`run`方法,可以构建一个利用链。 利用链的构造如下: 1. 实例化`yii2/rest/IndexAction`并调用`run`方法。 2. `run`方法间接调用`...

    Yii核心组件AssetManager原理分析

    `registerClientScript`方法在CBaseListView的`run`方法中被调用,这个方法是用于注册需要在客户端执行的JavaScript脚本。在CListView中,`registerClientScript`调用了`registerCoreScript`,这一步骤确保了jQuery...

    Yii控制器中filter过滤器用法分析

    下面是关于Yii控制器中filter过滤器用法的详细知识点分析。 首先,Yii框架中的filter过滤器主要分为两大类:行为过滤器(Behavior Filter)和声明式过滤器(Declarative Filter)。行为过滤器以对象的形式存在,...

    Yii框架函数简单用法分析

    本文实例讲述了Yii框架函数简单用法。分享给大家供大家参考,具体如下: 1.redict return $this->redirect(['login']); redict其实是对于以下的封装 等同于 ... * @param bool $runValidation whether to perfo

    Yii 框架入口脚本示例分析

    4. 加载应用配置:应用配置包含了诸如数据库连接、组件配置、路由规则等信息。入口脚本会加载这些配置文件,以便应用在启动时能够应用这些配置信息。 5. 创建应用实例并配置:Yii框架允许创建Web应用和控制台应用两...

    Yii+MYSQL锁表防止并发情况下重复数据的方法

    接下来,详细分析Yii中如何利用锁表防止并发导致的重复数据问题: 1. 写锁定防止重复数据插入 写锁定是一种比较强烈的锁定,它保证在一个事务中的写操作完成前,其他的读操作和写操作都会被阻塞。在Yii中,可以使用...

    Yii框架创建cronjob定时任务的方法分析

    接着,我们来分析创建Yii框架的cronjob定时任务的具体步骤: 1. 首先,需要添加环境配置文件protected/config/console.php,这个文件负责配置Yii框架命令行应用的一些基本参数,包括基础路径(basePath)、应用名称...

    leadshop开源商城-PHP

    免费提供长期更新服务,应用涉及可视化装修、促销转化、裂变分销、用户精细化管理、数据分析等多个维度,追求极致体验,全面赋能商家,为商家创造价值。 主要特性: 1、Leadshop开源系统,基于Yii2开发,支持...

    phpstorm

    4. **代码分析**:PHPStorm可以分析整个项目,找出可能的性能瓶颈、未使用的变量和过时的代码。 5. **代码对比**:比较不同版本的文件,理解代码更改历史。 6. **VCS集成**:利用版本控制系统进行代码版本管理,...

    phpstorm-settings

    - 自定义外部工具的执行路径和参数,可以在 IDE 内部执行这些命令,提升开发流程的便利性。 9. **插件管理** - PHPStorm 的强大之处还在于其丰富的插件生态,通过 `Plugins` 可以安装和管理各种插件,增强 IDE ...

Global site tag (gtag.js) - Google Analytics