【yii】yii之组件详解-加载逻辑

加载逻辑php

Yii中组件components的加载是在CApplication被实例化的时候执行的。安全

代码:ide

public function __construct($config=null) 
{ 
    ...... 
    $this->preinit(); 
    $this->initSystemHandlers(); 
    $this->registerCoreComponents(); 
    $this->configure($config);    
    $this->attachBehaviors($this->behaviors);              
    $this->preloadComponents(); 
    $this->init(); 
}


1.Yii首先调用$this->registerCoreComponents()方法来注册核心组件如错误处理、函数

URL管理、请求、安全管理、日志等,this

2.而后调用$this->configure($config)来加载配置,url

3.接着调用$this->preloadComponents来预先建立在配置文件中列入'preload'配置项的那spa

些组件实例,设计

4.最后调用$this->init()进行初始化操做。日志

那么若是你定义了本身的urlManager,你的urlManager到底是何时覆盖掉原先已经注册的缺component

省核心组件的呢?

代码:

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


很简单的实现,就是把config文件中的各个配置项设置为CApplication的属性键值对,看起来没作

任何和组件注册/加载相关的事情。

实际上这里是经过魔法函数来实现自定义组件的注册的,CApplication的基类是CModule,而

CModule的基类是CComponent,在调用$this->components='....' 的时候,实际上PHP

自动触发了CComponent__set方法,该方法被Yii重载,调用了setter方法(set+$name)

setcomponents(注意:PHP函数大小写不敏感,因此实际调用的是CModule类的

setComponents方法)来注册了应用自定义的组件。

如今搞清楚了组件是如何注册和预先加载的,那究竟何时自定义组件会失效呢?


1.显式的调用setComponentssetComponent固然能够,

2.但有些函数不那么明显,会隐式的覆盖掉已加载的组件,这样更麻烦,好比

CModule::getModule函数,该函数会从新调用模块的初始化函数init(),在初始化的时候,

若是该模块设置了本身的components,那么已注册或加载的组件就会被从新覆盖(好比Gii

模块)。

相似的状况在进行模块和组件依赖关系设计的时候须要注意。

相关文章
相关标签/搜索