缓存具有重复名称的插件和普通控制器

时间:2011-12-27 17:07:31

标签: cakephp caching cakephp-2.0

我遇到了与Cake 2.0中的缓存,插件和重复模型名称相关的问题。我的应用程序有几个控制器只包含公共使用的动作(视图,索引和等价物)。数据由CMS管理,CMS作为插件添加,插件控制器的某些名称相同。

例如,我的应用程序中有一个PostsController,插件的PostsController。插件控制器扩展PluginAppController,公共控制器根据手册扩展AppController。一旦启动缓存(通过将debug设置为0),问题就会开始。 Cake尝试访问扩展add的控制器中不存在的AppController操作,公共应用程序尝试从PluginAppController访问方法。

我不明白为什么Cake会这样做并且它会创建各种错误(空白页面,丢失的会话),这些错误也未正确记录。一切都运行良好,而应用程序仍在Cake 1.3上运行,也在2.0生产模式下运行。

cake_core_file_map目录中的文件/tmp/cache/persistent/似乎导致了问题。一旦我删除它并重新加载任何一个视图,它就会正确呈现。所以程序如下:

  • 成功加载http://www.example.com/admin/posts;
  • 加载http://www.example.com/posts(无法渲染);
  • 清除缓存(或只是cake_core_file_map);
  • 成功加载http://www.example.com/posts;
  • 加载http://www.example.com/admin/posts(现在无法正确加载)。

我的猜测是Cake无法在cake_core_file_map中保存对插件和主应用程序路径的正确引用,但我不知道如何强制Cake在这方面表现得很好。

有没有人知道如何阻止Cake将插件的控制器与其他具有重复名称的控制器混淆?

修改

此问题可能与Cake中的错误有关,因为this report提到类似问题,cake_core_file_map也是如此。不幸的是,here提到的修复无效。

编辑2 确实有一些自定义路由正在进行,这在Cake 1.3中正常工作。这来自routes.php

Router::connect('/plugin_name', array('plugin' => 'plugin_name', 'controller' => 'users', 'action' => 'login'));
Router::connect('/admin/*', array('plugin' => 'plugin_name', 'controller' => 'posts', 'action' => 'index'));

3 个答案:

答案 0 :(得分:2)

可能有助于覆盖Cake的插件的标准缓存文件名,以使缓存引擎单独保存它。 在加载插件时在主引导程序文件中:

CakePlugin::loadAll(array('Plugin' => array('bootstrap' => true));

在Plugin direcrory中 /app/Plugin/Plugin/Config/bootstrap.php

<?php
Cache::config('_cake_core_', array(
    'engine' => 'File',
    'prefix' => 'cake_core_plugin_',
    'path' => CACHE . 'persistent' . DS,
    'serialize' => true,
    'duration' => '+999 days',
));
?>

答案 1 :(得分:0)

主应用和插件之间是否存在冲突路由?这听起来像你可能需要为你的主要应用程序中的/ posts和/ admin / posts创建一条路线。这应该覆盖插件中的路由,从而导致任何冲突。当然,在尝试更改之前清除缓存。

//main app posts route
Router::connect(
    '/posts',
    array(
        'controller' => 'Posts'
        'action' => 'index'
    )
);

//plugin posts route
Router::connect(
    '/admin/posts',
    array(
        'controller' => 'Posts'
        'action' => 'index',
        'plugin' => 'CmsPlugin'
    )
);

答案 2 :(得分:0)

结果证明这是一个已知问题(不会让它变得不那么烦人),并且只会在this Cake bug report中修复下一个主要版本。

PHP 5.2没有名称空间支持,这显然需要Cake支持重复的类名。 PHP 5.3具有命名空间支持,Cake 3.0将需要该版本。