`

Yii分析1:web程序入口(2)

阅读更多

 

接上篇:Yii分析1:web程序入口(1)

 

然后调用了两个初始化异常/错误和注册核心组件的方法:

         $this->initSystemHandlers();  
         $this->registerCoreComponents();  

 函数实现如下:

    //初始化errorhandler和exceptionhandler
    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());
    } 

 registerCoreComponents调用了CWebApplication的方法:

    protected function registerCoreComponents()
    {
        parent::registerCoreComponents();

        $components=array(                   
 
            //url路由类
            'urlManager'=>array(                                                  
                'class'=>'CUrlManager',                                           
            ),             
            //http请求处理类
            'request'=>array(
                'class'=>'CHttpRequest',                                          
            ),
            //session
处理类
            'session'=>array(
                'class'=>'CHttpSession',                                          
            ), 
 
            //assets文件管理类
            'assetManager'=>array(                                                
                'class'=>'CAssetManager',                                         
            ),                          
            //用户类
            'user'=>array(                                                        
                'class'=>'CWebUser',
            ),
            //主题管理类
            'themeManager'=>array(
                'class'=>'CThemeManager',
            ),

            //认证管理类
            'authManager'=>array(
                'class'=>'CPhpAuthManager',
            ),

             //客户端脚本管理类
            'clientScript'=>array(
                'class'=>'CClientScript',
            ),
        );

        $this->setComponents($components);
    }

 其中CWebApplication的parent中代码如下:

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

setComponents定义在CModule中:

    /**
     * Sets the application components.
     *
     * When a configuration is used to specify a component, it should consist of
     * the component's initial property values (name-value pairs). Additionally,
     * a component can be enabled (default) or disabled by specifying the 'enabled' value
     * in the configuration.
     *
     * If a configuration is specified with an ID that is the same as an existing
     * component or configuration, the existing one will be replaced silently.
     *
     * The following is the configuration for two components:
     * <pre>
     * array(
     *     'db'=>array(
     *         'class'=>'CDbConnection',
     *         'connectionString'=>'sqlite:path/to/file.db',
     *     ),
     *     'cache'=>array(
     *         'class'=>'CDbCache',
     *         'connectionID'=>'db',
     *         'enabled'=>!YII_DEBUG,  // enable caching in non-debug mode
     *     ),
     * )
     * </pre>
     *
     * @param array application components(id=>component configuration or instances)
     */
    public function setComponents($components)
    {
        foreach($components as $id=>$component)
        {
            //如果继承了IApplicationComponent,则立即set,否则放进_componentConfig数组中
            if($component instanceof IApplicationComponent)
                $this->setComponent($id,$component);
            else if(isset($this->_componentConfig[$id]))
                $this->_componentConfig[$id]=CMap::mergeArray($this->_componentConfig[$id],$component);
            else
                $this->_componentConfig[$id]=$component;
        }
    } 
 

 

之后这三行代码:

        $this->configure($config);
        $this->attachBehaviors($this->behaviors);
        $this->preloadComponents();

 每一行都做了很多工作,我们一步一步分析:

 

$this->configure($config);

 CApplication并没有configure方法,因此我们查看父类CModule的configure方法:

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

 是否还记得$config这个变量?其实它是一个数组包含了一些基本配置信息,例如(yii自带blog demo):

return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'blog',
    'defaultController'=>'post',
……
}

 configure看起来仅仅是将数组的键值对赋值给类的变量和值,其实这里使用了__set方法,而CModule并没有__set方法,因此看他的父类CComponent:

    public function __set($name,$value)
    {
        $setter='set'.$name; 
        //如果set开头的方法存在,则调用set方法进行赋值
        if(method_exists($this,$setter))
            $this->$setter($value);         
        //如果有on开通的事件函数,则调用该事件函数处理
        else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
        {
            // duplicating getEventHandlers() here for performance
            $name=strtolower($name);
            if(!isset($this->_e[$name]))
                $this->_e[$name]=new CList;
            $this->_e[$name]->add($value);
        }  
        //如果只存在get方法,那么说明这个属性是制度的,抛出异常 
        else if(method_exists($this,'get'.$name))
            throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.',
                array('{class}'=>get_class($this), '{property}'=>$name)));           
        //否则抛出异常
        else            
            throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
                array('{class}'=>get_class($this), '{property}'=>$name)));
    }
 

接下来是:

        $this->attachBehaviors($this->behaviors);

 依然调用的CComponent中的方法:

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

 事实上,这里$this->behavior还是空的,因此这里并没有做什么事情;

 

之后是:

$this->preloadComponents();

 调用的是CModule中的方法:

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

 是否还记得config会配置一个键名为'preload‘的数组成员?在这里会将其中的类初始化;

 

最后调用的方法是:

        $this->init();

首先调用了CWebApplication中的init方法:

    protected function init()
    {
        parent::init();
        // preload 'request' so that it has chance to respond to onBeginRequest event.
        $this->getRequest();
    }
 

其中调用了父类的父类CModule中的方法init:

    protected function init()
    {
    }

 没有做任何事

 

到这里,new CreateWebApplication的工作全部完成,主要过程总结如下:

 

读取配置文件;

将配置文件中的数组成员赋值给成员变量;

初始化preload配置的类;

 

 

(未完待续)

 

 

 

 

 

分享到:
评论
1 楼 philip8728 2012-09-11  
给力 还有后续的吗?

相关推荐

    Yii2的基本应用程序模板 yii-basic-app-2.0.12

    "yii-basic-app-2.0.12"是Yii2框架的一个基础应用程序模板,适用于初学者和小型项目。这个模板提供了构建Web应用的基本结构和配置,让开发者能够快速上手。 1. **目录结构**: - `config`:包含应用程序的配置文件...

    yii2.0基础高级应用程序模板

    Yii 2.0 是一款基于组件的高性能 PHP 框架,用于开发 Web 2.0 应用程序。此框架提供了丰富的特性,包括 MVC(模型-视图-控制器)架构模式、活动记录(Active Record)、依赖注入(Dependency Injection)、单元测试...

    Yii框架快速入门

    ### Yii框架快速入门详解 #### 一、Yii框架概述 ...通过深入理解其核心概念,如入口脚本、应用程序以及MVC架构的运用,开发者可以充分利用Yii的强大功能,快速构建出稳定、高效且可维护的Web应用。

    YII2框架代码

    2. 高级版YII2框架:适用于大型复杂的Web应用程序,提供了更清晰的模块化结构和多应用支持。高级版分为前端和后端两个独立的应用,每个应用都有自己的入口脚本、控制器、模型和视图,以及独立的配置,可以更好地分离...

    php yii源码分析

    入口文件是每个 Web 应用程序的起点,对于 Yii 而言,`index.php` 文件是应用的入口。在这个文件中,Yii 的主要配置和初始化过程发生。例如,`$yii` 变量指向了框架的核心入口点 `yii.php`,而 `$config` 指向应用...

    新下载的yii2,yii framework

    Yii2 是一个高性能的、基于组件的 PHP 框架,用于开发Web应用程序。它遵循“简洁即高效”的设计理念,提供了丰富的特性,如MVC(Model-View-Controller)、I18N/L10N(国际化和本地化)、缓存管理、数据库抽象层以及...

    yii2-v2.0.6

    1. **性能优化**:Yii 2.0.6 可能对框架的一些核心组件进行了性能优化,例如查询构建器、路由解析和视图渲染,使得应用程序运行更快。 2. **错误修复**:开发者通常会遇到各种 bugs,Yii 社区会积极跟踪并修复这些...

    Yii_PHP_框架分析

    Yii PHP 框架分析 Yii 是一个高性能的,基于组件的 PHP 框架,用于开发 Web2.0 应用程序。本分析将深入探讨 Yii 的基本操作,包括...通过深入理解这些基础知识,开发者能够更好地利用 Yii 构建高质量的 Web 应用程序。

    yii2 basic

    2. **目录结构**:Yii2 Basic的目录结构清晰,包括了`web`(Web服务器的入口目录)、`config`(配置文件)、`runtime`(运行时生成的文件)、`models`(模型)、`controllers`(控制器)、`views`(视图)等。...

    yii1.1版本资料整理

    1. 高重用性:Yii框架设计了大量可重用的组件和功能模块,以便开发者可以简单地复用这些模块来快速构建应用程序。 2. 高效性:Yii使用懒加载和数据缓存等技术手段,减少了不必要的资源消耗,显著提高了应用程序的...

    Yii框架学习笔记.pdf

    1. **项目入口脚本**:在Yii框架中,项目的入口脚本通常命名为index.php,该脚本包含引导文件yii.php和配置文件main.php。index.php脚本会设置两个关键常量YII_DEBUG和YII_TRACE_LEVEL,分别用于控制调试模式的开启...

    advanced yii2框架

    Yii2 是一个基于组件、高性能的 PHP 框架,用于开发 Web 2.0 应用程序。"Advanced Yii2 Framework" 提供了一个高级项目结构,适合大型企业级应用或者需要复杂前后端分离的项目。它将应用程序分为前端、后端和共同...

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

    1. **程序结构及配置** Yii的项目结构通常包含以下关键部分: - `protected`:存放应用的核心代码,如模型、控制器、配置文件等。 - `runtime`:运行时目录,存储日志、缓存文件等。 - `webroot`:网站的公共...

    yii-usermanager:基于 Yii 框架构建的用户管理应用程序

    - `web/`:Web 根目录,包含入口脚本、静态资源(CSS、JS 文件)等。 - `.gitignore`:定义了版本控制系统忽略的文件和目录。 - `composer.json`:定义项目依赖和元数据,用于 Composer 包管理。 - `README.md`:...

    Yii_PHP_框架源码分析.pdf

    Yii是一个基于PHP语言的开源Web应用框架,提供了许多便捷的功能和工具来帮助开发者快速构建Web应用程序。本文主要对Yii框架的源码进行分析,探究其内部机制和实现原理。 1. 启动机制 Yii框架的启动机制是通过index...

    yii框架中文手册教程

    1. 性能优越:Yii框架采用了各种优化技术,保证了Web应用的高性能,尤其在处理大量数据和高流量的Web应用时表现优异。 2. 组件化设计:Yii框架采用基于组件的设计模式,开发者可以通过复用组件快速组装出复杂的Web...

    yii2 console 集成swoole 执行异步任务,例如注册邮件,发送短信

    在Web开发中,Yii2 Console组件常用于处理后台任务,如定时任务、数据迁移等。然而,对于需要即时响应或者非阻塞操作的任务,如注册邮件发送、短信通知等,我们可以利用Swoole扩展来实现异步处理,从而提高系统效率...

    php yii2框架初始项目 源码

    Yii2框架是PHP社区中最流行的高级Web开发框架之一,它基于组件、...通过这个初始项目,开发者可以快速了解Yii2框架的架构和工作原理,同时也是一个很好的起点,可以根据需求扩展和定制功能,打造自己的Web应用程序。

Global site tag (gtag.js) - Google Analytics