Cakephp 使用重复名称缓存插件和普通控制器
我遇到了一个与Cake 2.0中的缓存、插件和重复模型名相关的问题。我的应用程序有几个控制器,其中只包含供公共使用的操作(视图、索引和等价物)。数据由作为插件添加的CMS管理,插件控制器的一些名称相同 例如,我的应用程序中有一个PostsController,插件中有一个PostsController。插件控制器按照手册扩展Cakephp 使用重复名称缓存插件和普通控制器,cakephp,caching,cakephp-2.0,Cakephp,Caching,Cakephp 2.0,我遇到了一个与Cake 2.0中的缓存、插件和重复模型名相关的问题。我的应用程序有几个控制器,其中只包含供公共使用的操作(视图、索引和等价物)。数据由作为插件添加的CMS管理,插件控制器的一些名称相同 例如,我的应用程序中有一个PostsController,插件中有一个PostsController。插件控制器按照手册扩展PluginAppController,公共控制器扩展AppController。一旦启动缓存(通过将debug设置为0),问题就开始了。Cake尝试访问扩展了AppCont
PluginAppController
,公共控制器扩展AppController
。一旦启动缓存(通过将debug
设置为0
),问题就开始了。Cake尝试访问扩展了AppController
的控制器中不存在的add
操作,公共应用程序尝试从PluginAppController
访问方法
我不明白为什么Cake会这样做,它会产生各种各样的错误(空白页、丢失的会话),这些错误也没有正确记录。当应用程序仍在Cake 1.3和2.0生产模式下运行时,一切正常
/tmp/cache/persistent/
目录中的文件cake\u core\u file\u map
似乎是问题的根源。一旦我删除它并重新加载任何一个视图,它就会正确渲染。因此,程序如下:
- 加载<代码>http://www.example.com/admin/posts成功李>
- 加载<代码>http://www.example.com/posts(无法呈现)李>
- 清除缓存(或只清除cake_core_文件_map)李>
- 加载<代码>http://www.example.com/posts成功李>
- 加载<代码>http://www.example.com/admin/posts(现在无法正确加载)
Cake\u core\u file\u map
中保存对插件和主要应用程序路径的正确引用,但我不知道如何强制Cake在这方面表现良好
有人知道如何防止Cake混淆插件的控制器和其他具有重复名称的控制器吗
编辑
这个问题可能与Cake中的bug有关,正如前面提到的类似问题和Cake\u core\u file\u map
一样。不幸的是,上面提到的修复方案不起作用
编辑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'));
主应用程序和插件之间是否存在冲突路径?听起来您可能需要在主应用程序中为/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'
)
);
事实证明,这是一个已知的问题(这并没有让它变得不那么烦人),并且只会在下一个主要版本中修复,根据
PHP5.2没有命名空间支持,显然Cake需要命名空间支持重复的类名。PHP5.3具有名称空间支持,Cake 3.0将需要该版本 如果能覆盖Cake的插件标准缓存文件名,让缓存引擎将其单独保存,可能会很有帮助。 加载插件时,在主引导文件中:
CakePlugin::loadAll(array('Plugin' => array('bootstrap' => true));
直译
/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',
));
?>
我已经用my routes.php中的相关条目更新了我的问题。这看起来有序吗?您列出的两条路由都指向插件(因此是数组中的插件键)。但是,您的问题指出,一条路径应该指向插件的Post控制器,而另一条路径应该指向应用程序的Post控制器。插件也名为Posts吗?因此有两个控制器和一个名为Posts的插件?另外,请记住,控制器命名约定随CakePHP 2.0而改变。您需要确保控制器名称正确大写。插件中有一个名为Posts的控制器,应用程序中有一个名为Posts的控制器。插件有不同的名称(比如说cms
)。发布的路线只是我的插件路线,还有三条其他路线(两条与RSS源相关,一条与地图控制器连接到Cake的家)。对admin/*
的任何请求都应该被重新路由到CMS插件。这并不是一个CakePHP错误,更多的是PHP5.2的不当使用。它在CakePHP 3中可用的唯一原因是它需要支持名称空间的PHP5.3。这是CakePHP 2的正确答案。*。这篇文章是6年前写的,但它仍然拯救了这一天!