之前遇到这个问题
例如:有两个插件,命名为p1,p2,在这两个插件下,分别建一个TestController,里面都有index方法,一个输出test1,一个输出test2。
如果在调试模式下,不会冲突、但是在正式环境中测试,就出问题了,要么只能访问test1,要么只能访问test2,
找了很多原因,结果发现,在缓存的时候,出了问题,
系统自带的缓存,把'plugin.'.$name作为键,文件绝对地址作为值,
libCakeCoreApp.php第783行
if ($plugin) {$key = 'plugin.'.$plugin."." . $name;}
也就是说,只要是在插件中,控制器名字一样,就只能存下一个地址,
现在修改读取缓存和写入缓存的地方
libCakeCoreApp.php
_map方法中,修改784行和789行,
protected static function _map($file, $name, $plugin = null) { $key = $name; if ($plugin) { $key = 'plugin.'.$plugin."." . $name; } if ($plugin && empty(self::$_map[$name])) { self::$_map[$key] = $file; } if (!$plugin && empty(self::$_map['plugin.'.$plugin."." . $name])) { self::$_map[$key] = $file; } if (!self::$bootstrapping) { self::$_cacheChange = true; } }
_mapped方法中,修改808行
protected static function _mapped($name, $plugin = null) { $key = $name; if ($plugin) { $key = 'plugin.' .$plugin."." . $name; } return isset(self::$_map[$key]) ? self::$_map[$key] : false; }
把'plugin.'.$name修改为'plugin.'.$plugin."." . $name
意思就是说,在缓存的时候,带上插件的名称,读取的时候,也带上插件的名称,这样就不会混淆了。