因公司一项老业务交接给了我,最近开始看老业务的代码,代码使用的Cola框架,之前我也没用过。但框架都长那样,之前看过CI,laravel,也啃过一点YII,现在又有好久没有接触框架了,于是就想简单看一下这个框架的运行过程。话不多说,开始吧:本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
入口文件在定义基本目录路径之后,加载Cola.php和配置文件,然后做了三件事。分别是getInstance(),boot(),dispatch()代码如下:本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
require COLA_DIR.'/Cola.php'; Cola::getInstance()->boot($config)->dispatch();其中:Cola::getInstance() 完成拿到实例化Cola类,定义好MVC等各种功能基类文件路径,然后就是去实例化Cola_Config类。然后使用registerAutoload注册自动加载的方法为Cola::loadClass。getInstance的功能就完成了。代码如下:
protected function __construct() { $config['_class'] = array( 'Cola_Router' => COLA_DIR . '/Router.php', 'Cola_Model' => COLA_DIR . '/Model.php', 'Cola_View' => COLA_DIR . '/View.php', 'Cola_Controller' => COLA_DIR . '/Controller.php', 'Cola_Com' => COLA_DIR . '/Com.php', 'Cola_Com_Widget' => COLA_DIR . '/Com/Widget.php', 'Cola_Exception' => COLA_DIR . '/Exception.php' ); self::$config = new Cola_Config($config); self::$_config = &self::$config->reference(); Cola::registerAutoload(); }boot($config) 完成单独的配置文件加载并判断数组,另外将上面的_class字段与这个合并成一个配置数组。
dispatch() 这个方法进去后第一步通过Router类拿到PATH_INFO数据并通过Router类的match方法分析路由,主要是和用户的自定义路径进行匹配,然后通过_enableDynamicMatch方法拿到controller和action参数。$this->_dispatchInfo就是一个数组里面包括controller和action,另外里面还有一个$file, 我看业务里面没有用到,通过看代码发现它应该是在_urls中除了可以配置controller和action参数外,另外也可以只配置一个文件名或者路径,然后Cola可以通过这两种方式来加载对应的处理文件。除此之处,这个处理文件不一定是类,也可以是方法,因为下面的逻辑可以看到call_user_func可以执行不只有数组参数,还可以直接传入一个方法来处理。
到这里框架的基本逻辑也就完成了,剩下的就是调用具体控制器的具体方法来进行处理,在对Cola核心类的loadClass自动加载类方法进行输出时,罗列出了Cola自动加载文件的顺序,顺序如下:
Cola_Router------------
业务控制器------------
Cola_Controller------------
Cola_Request------------
业务模型-----------
Cola_Model------------
Cola_Com------------
Cola_Com_Cache------------
Cola_Com_Cache_Redis------------
Cola_Com_Cache_Abstract------------
Cola_Com_Db------------
Cola_Com_Db_Masterslave------------
Cola_Com_Db_Abstract------------
Cola_Com_Db_Pdo_Mysql------------
Cola_Com_Db_Pdo_Abstract------------本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
可以看到最先初始化路由,路由确定之后就加载业务控制器,其都是继承核心控制器基类,基类控制器就会去调用核心的Misc辅助类,Request请求数据类,业务模型再去初始化基类模型,连接数据库,缓存。另外在初次使用时我发现Cola框架中有一个错误,当然也许是我的环境有关,我的PHP版本是php7.1。运行中有报错:Fatal error: Only variables can be passed by reference in ...ColaController.php on line 176,在控制器的核心基类ColaController.php第176行代码如下:本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
#下面是176行的代码
return array_merge(Cola::reg('_params', null, array()), $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV);
#其调用的reg方法$value不允许使用null,因为直接对null取不到值
public static function reg($name = null, &$value = null, $default = null)
#问题的解决方法,不要直接传null
$t = null;
return array_merge(Cola::reg('_params', $t, array()), $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV);本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
可以看到array_merge传入的参数是直接的null值,而调用的reg方法在参数引用上对这个值是地址引用,直接对null引用报错从而导致了这个问题。可以使用参数替代即可解决,解决方法在见上面最后两行代码。本文地址:http://www.04007.cn/article/582.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/582.html 未经许可,不得转载. 手机访问本页请扫描下方二维码:
|