Cakephp 使用重复名称缓存插件和普通控制器

Cakephp 使用重复名称缓存插件和普通控制器,cakephp,caching,cakephp-2.0,Cakephp,Caching,Cakephp 2.0,我遇到了一个与Cake 2.0中的缓存、插件和重复模型名相关的问题。我的应用程序有几个控制器,其中只包含供公共使用的操作(视图、索引和等价物)。数据由作为插件添加的CMS管理,插件控制器的一些名称相同 例如,我的应用程序中有一个PostsController,插件中有一个PostsController。插件控制器按照手册扩展PluginAppController,公共控制器扩展AppController。一旦启动缓存(通过将debug设置为0),问题就开始了。Cake尝试访问扩展了AppCont

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

例如,我的应用程序中有一个PostsController,插件中有一个PostsController。插件控制器按照手册扩展
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未能在
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年前写的,但它仍然拯救了这一天!