十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
加载逻辑
创新互联主要从事网站设计制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务宿城,十载网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108Yii中组件components的加载是在CApplication被实例化的时候执行的。
代码:
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管理、请求、安全管理、日志等,
2.然后调用$this->configure($config)来加载配置,
3.接着调用$this->preloadComponents来预先创建在配置文件中列入'preload'配置项的那
些组件实例,
4.最后调用$this->init()进行初始化操作。
那么如果你定义了自己的urlManager,你的urlManager究竟是什么时候覆盖掉原先已经注册的缺
省核心组件的呢?
代码:
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
模块)。
类似的情况在进行模块和组件依赖关系设计的时候需要注意。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。