2013-04-02 09:51:47  浏览:1582

cakephp 插件 兼容

cakephp,兼容不同插件中相同的控制器

之前遇到这个问题
例如:有两个插件,命名为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
意思就是说,在缓存的时候,带上插件的名称,读取的时候,也带上插件的名称,这样就不会混淆了。

返回首页