我遇到了与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
(无法渲染); 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'));
答案 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将需要该版本。