在 程序入口处,index.php 用一句 Yii::createWebApplication($config)->run();  开始了app的运行。

那么,首先查看 CWebApplication 的 构造函数,如下:

public function __construct($config=null)
{
Yii::setApplication($this);
// set basePath at early as possible to avoid trouble
if(is_string($config))
$config=require($config);
if(isset($config['basePath']))
{
$this->setBasePath($config['basePath']);
unset($config['basePath']);
}
else
$this->setBasePath('protected');
Yii::setPathOfAlias('application',$this->getBasePath());
Yii::setPathOfAlias('webroot',dirname($_SERVER['SCRIPT_FILENAME']));
Yii::setPathOfAlias('ext',$this->getBasePath().DIRECTORY_SEPARATOR.'extensions');
$this->preinit();
$this->initSystemHandlers();
$this->registerCoreComponents();
$this->configure($config);
$this->attachBehaviors($this->behaviors);
$this->preloadComponents();
$this->init();
}

再来看下,run()函数的流程:

public function run()
{
if($this->hasEventHandler('onBeginRequest'))
$this->onBeginRequest(new CEvent($this));
register_shutdown_function(array($this,'end'),0,false);
$this->processRequest();
if($this->hasEventHandler('onEndRequest'))
$this->onEndRequest(new CEvent($this));
}

最后看框架是如何处理请求的:

public function processRequest()
{
if(is_array($this->catchAllRequest) && isset($this->catchAllRequest[0]))
{
$route=$this->catchAllRequest[0];
foreach(array_splice($this->catchAllRequest,1) as $name=>$value)
$_GET[$name]=$value;
}
else
$route=$this->getUrlManager()->parseUrl($this->getRequest());
$this->runController($route);
}


由此可知,在 框架中的配置文件中,指定的 preload 组件,会在处理请求和路由分析之前执行,那么通过preload机制,我们能做的事就很多了,
比如:
想动态加载一些路由测略时,就可以自定义组件,先行于 processRequest进程,在自己的组件里 $this->getUrlManager()->addRules()。

值得一提的是,Yii里的组件是单例模式,先判断有没有已经存在,再去实例化组件,这使得在各个地方调用的组件延续性很好。

最新文章

  1. init.css
  2. 唯美!分享8款响应式的 WordPress 餐厅主题
  3. linux 通过scp 复制备份恢复mysql数据表
  4. Oracle SQL语句追踪
  5. Java 操作MySql数据库
  6. How to Send Information (String, Image, Record) Between Two Applications
  7. JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息
  8. android 注释常用标签
  9. JSONP跨域的原理
  10. [WPF]ListView点击列头排序功能实现
  11. 显示标题栏中标题左侧的小图icon
  12. 原生js封装table表格操作,获取任意行列td,任意单行单列方法
  13. EF中的EntityState几个状态的说明
  14. Win10个性化设置
  15. JSP标签c:forEach报错(二)
  16. SpringCloud笔记一:扫盲
  17. (59)Wangdao.com第十天_JavaScript 对象在 栈和堆
  18. Docker下安装Influxdb-1.6.1和Grafana5.2.2
  19. Linux下的计算命令和求和、求平均值、求最值命令梳理
  20. keras 文本分类 LSTM

热门文章

  1. linux下文件结束符
  2. 如何修改mysql默认的数据库密码
  3. sql字段中逗号分隔字符串的判断
  4. netstat命令的常见用法(转)
  5. tc 147 2 PeopleCircle(再见约瑟夫环)
  6. springMVC之配置
  7. Flash+XML前后按钮超酷焦点图,层叠翻转图形
  8. C语言各种标准的
  9. C语言多线程编程 死锁解析
  10. CSS3实现背景颜色渐变 摘抄