加载逻辑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.显式的调用setComponents和setComponent固然能够,
2.但有些函数不那么明显,会隐式的覆盖掉已加载的组件,这样更麻烦,好比
CModule::getModule函数,该函数会从新调用模块的初始化函数init(),在初始化的时候,
若是该模块设置了本身的components,那么已注册或加载的组件就会被从新覆盖(好比Gii
模块)。
相似的状况在进行模块和组件依赖关系设计的时候须要注意。