开启多模块开发时用同样的模型名引发数据库写入异常

浏览:515 发布日期:2015/10/23
3.2.3 - 严重 - 已关闭
该问题重现的环境为

1、关闭系统的调试模式,即修改入口文件中的 APP_DEBUG 常量为 falsedefine('APP_DEBUG', false);2、创建多模块,例如一个Home模块,一个Passport模块。并且在两个模块中加入相同名称的模型文件,但两个模型文件中指定不同的表名。例如:



3、通过不同的控制器来测试,首先在Home模块中创建IndexController.class.php文件进行查看

结果Home中的User模型类与Passport模块中的User模型中fields成一样的了。

实际上两个模型对应的表是不一样的


这样就导致了其中一个表的增删改查会有问题了。

出现该问题以后经过一步一步排查,最终发现是在ThinkPHP的模型类中,模型初始化时根据当前的模型名称生成了模型列名缓存,而这个缓存的key的格式是库名加模型名命名的。



修改方法:
1、在基础模型类/thinkphp/ThinkPHP/Library/Think/Model.class.php的最后位置加入新方法    /**
     * 获取当前模型的模块名
     * @return multitype:
     * @author byron sampson
     */
    private function getModuleName(){
        $class = new \ReflectionClass($this);
        $namespace = $class->getNamespaceName();
        list($module) = explode('\\', $namespace);
        return $module?:'Common';
    }
将112行的$fields = F('_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name));修改为$fields = F($this->getModuleName().'/_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name));将116行的F('_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name),$this->fields);修改为F($this->getModuleName().'/_fields/'.strtolower($db.'.'.$this->tablePrefix.$this->name),$this->fields);即可。

该问题已发现两年多了,官方一直没有给解决。现在提出来希望官方能处理一下,毕竟现在ThinkPHP比较主流,大型网站用的比较多。
评论(
后面还有条评论,点击查看>>