Кэширующий плагин и обычные контроллеры с дублирующимися именами - PullRequest
0 голосов
/ 27 декабря 2011

Я столкнулся с проблемой, связанной с кэшированием, плагинами и дублирующимися именами моделей в Cake 2.0.Мое приложение имеет несколько контроллеров, содержащих только действия для общего пользования (просмотр, индекс и эквиваленты).Данные управляются CMS, которая добавляется как плагин, некоторые имена контроллера плагина совпадают.

Например, в моем приложении есть PostsController и PostsController для плагина.Контроллер плагина расширяет PluginAppController, а публичный контроллер расширяет AppController согласно инструкции.Как только начинается кэширование (путем установки debug в 0), начинаются проблемы.Cake пытается получить доступ к несуществующему действию add в контроллере, который расширяет AppController, а общедоступное приложение пытается получить доступ к методам из PluginAppController.

Я не понимаю, почему Cake сделал бы этои это создает все виды ошибок (пустые страницы, потерянные сеансы), которые также не регистрируются должным образом.Все работало хорошо, пока приложение все еще работало на Cake 1.3, а также в производственном режиме 2.0.

Файл cake_core_file_map в каталоге /tmp/cache/persistent/, кажется, вызывает проблему.Как только я удаляю это и перезагружаю любое из представлений, это отрисовывает правильно.Таким образом, процедура выглядит следующим образом:

Я предполагаю, что Cake не удаетсясохраните правильные ссылки на плагин и основные пути приложения в cake_core_file_map, но я понятия не имею, как заставить Cake вести себя хорошо в этом отношении.

Кто-нибудь знает, как не дать Cake перепутать контроллеры плагина с другими с дублирующимися именами?

EDIT

Эта проблема может быть связанак ошибке в Cake, так как в этом отчете упоминает похожие проблемы, а также cake_core_file_map.Упомянутое исправление здесь , к сожалению, не работает.

EDIT 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 ]

2 голосов
/ 23 августа 2012

Может быть, было бы полезно переопределить стандартные имена файлов кэша Cake для Plugin, чтобы механизм кэша держал его отдельно. В основном файле начальной загрузки при загрузке плагина:

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',
));
?>
0 голосов
/ 03 января 2012

Это оказывается известной проблемой (которая не делает ее менее раздражающей) и будет исправлена ​​только в следующем основном выпуске, согласно этому отчету об ошибке Cake .

PHP 5.2 не имеет поддержки пространства имен, которая, очевидно, необходима для Cake для поддержки дублированных имен классов. PHP 5.3 имеет поддержку пространства имен, и Cake 3.0 потребует эту версию.

0 голосов
/ 28 декабря 2011

Есть ли конфликтующие маршруты между основным приложением и плагином? Похоже, вам может понадобиться создать маршрут для ваших / 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'
    )
);
...