CakePHP:CacheHelper和主题视图

时间:2012-05-02 19:44:48

标签: php cakephp caching cakephp-2.1

在CakePHP(2.1)应用程序中,我将主题与cacheAction一起使用。当访问例如/controller/action,其缓存文件已保存到tmp/views/controller_action.php。从移动网址(如m.example.com)访问同一视图时,我在内部使用带有主题视图的相同应用来简化移动设备的输出。

但是现在缓存存在问题:两个请求都有不同的主机名和主题,但是控制器/操作相同,因此缓存文件的文件名相同。因此,当访问具有不同主机或主题的URL时,CakePHP返回相同的缓存文件(或更准确地说是第一个请求的缓存文件)。根据参数(例如主机名或主题),无法更改缓存文件的名称。

我尝试修改CacheHelper的参数,但没有成功。有没有办法动态更改CacheHelper的缓存路径/前缀?还是有另一种可能实现这种行为吗?

2 个答案:

答案 0 :(得分:1)

解决此问题的唯一解决方法是以下步骤:

1)创建一个自己的MyCacheHelper,扩展CacheHelper并将其保存到app/View/Helper/CacheHelper.php。覆盖方法_writeFile()并使用前缀扩展$ path字符串的行:

App::uses('Helper', 'Cache');
class MyCacheHelper extends CacheHelper
{
  public function _writeFile($content, $timestamp, $useCallbacks = false)
  {
    // ...
    $cache = $prefix.strtolower(Inflector::slug($path));
    // ...
  }
}

2)创建一个自己的MyDispatcher,扩展Dispatcher并将其保存到app/Lib/Routing/MyDispatcher.php。覆盖方法cached()并使用前缀扩展$ path字符串的行:

App::uses('Dispatcher', 'Routing');
class MyDispatcher extends Dispatcher
{
  public function cached($path)
  {
    // ...
    $path = $prefix.strtolower(Inflector::slug($path));
    // ...
  }
}

3)更改文件app/webroot/index.php以使用新的调度程序:

App::uses('MyDispatcher', 'Routing');
$Dispatcher = new MyDispatcher();

4)更新控制器中的$helper参数,使用MyCache代替Cache

就是这样。有点复杂,但它按预期工作!现在,您可以根据需要调整$前缀,并为例如创建唯一的缓存文件。不同的领域。

答案 1 :(得分:1)

更好的解决方案:CakePHP 2.3现在支持核心配置中的缓存前缀:

Configure::write('Cache.viewPrefix', 'YOURPREFIX');

可以调整此前缀以匹配主题名称或这些请求中不同的其他一些参数。