Yii2中组件的注册与建设要领
副问题[/!--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; }这个要领就是轮回进口文件 好了,此刻就来看看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这个私有成员变量(即注册),然后呢?然后就没有下文了。。。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |