原文:http://www.daydaytc.com/php/305.html


本来以为onethink是在tp的基础上开发的,那么tp的文档应该适用于onethink,但是却恰恰相反。今天想使用以下tp的页面trace功能调试以下onethink,结果按照tp文档上所说,先开启debug调试,然后在项目配置文件中开启 ‘SHOW_PAGE_TRACE’ =>true,最后就可以了。结果弄来弄去没有看到页面trace的身影。

经过一步步调试也终于明白了。其实onethink在tp的基础上有点小改动。我们先来了解一下页面trace是怎么实现的。tp通过行为扩展实现了页面trace。在行为模式common.php中定义了

'app_end'    => array(
            'Behavior\ShowPageTraceBehavior', // 页面Trace显示
),


系统在初始化的时候会把此行为扩展加载到hook中,在app的run方法中调用了app_end标签,执行了ShowPageTraceBehavior类的run方法。


来看run方法干了什么..

判断一下如果不是ajax请求并且 SHOW_PAGE_TRACE为true,那么就调用其trace方法组合出调试信息并echo。

// 行为扩展的执行入口必须是run
public function run(&$params)
{
        if (!IS_AJAX && !IS_CLI && C('SHOW_PAGE_TRACE')) {
            echo $this->showTrace();
        }
 }

本来非常顺畅的一段,但是问题就是出在这个C(‘SHOW_PAGE_TRACE’).   经过调试后发现此时这个值竟是个0,也即是没有开启。但是我确实在配置文件中开启了为true。

这里就是onethink的改变。onethink在其后台有个配置系统,可以可视化的对配置进行修改。ot在其后台的公用控制器AdminController和前台的HomeController的初始化方法中都加入以下逻辑。

/* 读取数据库中的配置 */
$config    =    S('DB_CONFIG_DATA');
if(!$config){
    $config    =    D('Config')->lists();
    S('DB_CONFIG_DATA',$config);
}
C($config); //添加配置
$this->display();

意思就是读取数据库中的配置,合并到C函数的配置中。这样我们在以后使用c函数的时候看到的就是合并后的了。

这就是为什么我们明明设置了SHOW_PAGE_TRACE为true,但还是为false。因为数据库中是false,最后合并吧前面的值给覆盖了。所以我们要想使用页面trace的功能,需要在ot的后台进行设置。