加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Yii2中组件的注册与建设要领

发布时间:2021-03-22 23:46:38 所属栏目:编程 来源:网络整理
导读:本日原来规划研究一下yii2.0的AR模子的实现道理,然而,打算赶不上变革,溘然就想先研究一下yii2.0的数据库组件建设的进程。通过对yii源码的进修,相识了yii组件注册与建设的进程,并发明原本yii组件注册之后并不是顿时就去建设的,而是待到现实必要行使某个
副问题[/!--empirenews.page--]

 本日原来规划研究一下yii2.0的AR模子的实现道理,然而,打算赶不上变革,溘然就想先研究一下yii2.0的数据库组件建设的进程。通过对yii源码的进修,相识了yii组件注册与建设的进程,并发明原本yii组件注册之后并不是顿时就去建设的,而是待到现实必要行使某个组件的时辰再去建设对应的组件实例的。本文或许记录一下这个试探的进程。

  要相识yii组件的注册与建设,虽然要从yii进口文件index.php提及了,整个文件代码如下:

run();

可以看到进口文件引入了几个设置文件,并将全部设置文件的内容都归并到$config这个设置数组中,然后行使这个设置数组作为参数去建设一个应用实例。若将这个设置数组打印出来,就会看到,“components”下标对应的元素包括了yii组件的参数信息(这里只截图一小部门):

这些组件的信息是在引入进来的几个设置文件中设置的,Yii组件就是行使这些参数信息举办注册与建设的。

  接下来就进入yiiwebApplication类的实例化进程了,yiiwebApplication类没有结构函数,可是它担任了yiibaseApplication类:

以是会自动执行yiibaseApplication类的结构函数:

state = self::STATE_BEGIN; $this->preInit($config); $this->registerErrorHandler($config); Component::__construct($config); }

这里要趁便说一下预初始化要领preInit(),它的代码如下:

coreComponents() as $id => $component) { if (!isset($config['components'][$id])) { $config['components'][$id] = $component; } elseif (is_array($config['components'][$id]) && !isset($config['components'][$id]['class'])) { $config['components'][$id]['class'] = $component['class']; } } }

  这个函数对转达给结构函数的设置数组$config举办了一些预处理赏罚操纵(这里省略了),最后行使coreComponents()要领返回的数组对$config数组举办了完美,coreComponents()要领是这样的:

['class' => 'yiilogDispatcher'],'view' => ['class' => 'yiiwebView'],'formatter' => ['class' => 'yiii18nFormatter'],'i18n' => ['class' => 'yiii18nI18N'],'mailer' => ['class' => 'yiiswiftmailerMailer'],'urlManager' => ['class' => 'yiiwebUrlManager'],'assetManager' => ['class' => 'yiiwebAssetManager'],'security' => ['class' => 'yiibaseSecurity'],]; }

  着实就是一些焦点组件的设置,也就是嗣魅这些组件是可以不必要我们在设置文件中设置的,yii会自动举办注册。

  好了,回到yiibaseApplication类的结构函数,这个函数最后挪用了yiibaseComponent类的结构函数,但yiibaseComponent类是没有结构函数的,不外它担任了yiibaseObject类:

以是也自动执行了yiibaseObject类的结构函数:

init();}

这里首要是挪用了yiiBaseYii类的静态要领configure():

$value) { $object->$name = $value; } return $object; }

这个要领就是轮回进口文件(new yiiwebApplication($config))->run();中的$config数组(这个数组的布局拜见本文第一个截图),以数组键名作为工具属性名,对应的键值作为工具属性值举办赋值操纵。以是当轮回到组件设置参数的时辰是这样子的:$object->components = $value($value为全部组件的设置数组),也就是对$object的components属性举办赋值操纵,那这个$object是哪个类的工具呢?追念最初挪用的源头,着实它就是进口文件中必要举办实例化的yiiwebApplication类的工具啊。然而,这个类和它的祖先类都没有components这个成员变量啊,不急,又要举办一番担任套路了,顺着yiiwebApplication类的担任相关一层一层往上找可以发明yiiwebApplication类最终也担任了yiibaseObject类,yiibaseObject类是支持属性的,以是yiiwebApplication类也支持属性(关于属性,可以参考我的另一篇博文:yii2之属性),当赋值操纵找不到components成员变量时会挪用setComponents()要领,又去找这个要领的地址,终于在它的祖先类yiidiServiceLocator中找到了setComponents()要领,没错,对应用实例的components属性举办赋值操纵着实就是挪用这个要领!

  好了,此刻就来看看setComponents()这个要领到底干了啥:

$component) { $this->set($id,$component); } }

着实很简朴,就是轮回各个组件的设置数组,挪用set()要领,set()要领如下:

_components[$id]); if ($definition === null) { unset($this->_definitions[$id]); return; } if (is_object($definition) || is_callable($definition,true)) { // an object,a class name,or a PHP callable $this->_definitions[$id] = $definition; } elseif (is_array($definition)) { // a configuration array if (isset($definition['class'])) { $this->_definitions[$id] = $definition; } else { throw new InvalidConfigException("The configuration for the "$id" component must contain a "class" element."); } } else { throw new InvalidConfigException("Unexpected configuration type for the "$id" component: " . gettype($definition)); } }

着实就是把组件设置存入$_definitions这个私有成员变量(即注册),然后呢?然后就没有下文了。。。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读