2011-12-27 8 views
0

Cake 2.0のキャッシュ、プラグイン、および重複するモデル名に関する問題が発生しています。私のアプリケーションには、公開用のアクション(ビュー、インデックス、等価物)のみを含むコントローラがいくつかあります。データはプラグインとして追加されたCMSによって管理され、プラグインのコントローラのいくつかの名前は同じです。名前を重複してキャッシュするプラグインと通常のコントローラー

たとえば、私のアプリケーションにはPostsControllerがあり、プラグインにはPostsControllerがあります。プラグインコントローラはPluginAppControllerに拡張され、パブリックコントローラはAppControllerまで拡張されています。キャッシングが開始されると(debug0に設定すると)、問題が発生します。 Cakeはコントローラ内の存在しないaddアクションにアクセスしようとします。コントローラはAppControllerに拡張され、公開アプリケーションはPluginAppControllerからメソッドにアクセスしようとします。

私はCakeがこれを行う理由を理解しておらず、正しく記録されていないすべての種類のエラー(空白ページ、失われたセッション)も作成します。アプリはまだCake 1.3と2.0の生産モードで動作していたが、すべてうまくいっていた。

/tmp/cache/persistent/ディレクトリのファイルcake_core_file_mapが問題の原因であるようです。これを削除してビューのいずれかをリロードすると、レンダリングが正しく行われます。したがって、手順は次のとおりです。

  • ロード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_core_file_mapにプラグインし、メインアプリケーションのパスへの正しい参照を保存するために失敗しているが、私はその点でうまく動作するようにケーキを強制する方法を見当もつかない。

Cakeがプラグインのコントローラを重複した名前のコントローラと混同しないようにする方法を誰かが知っていますか?

EDIT

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

これは(それはあまり迷惑なことはありません)既知の問題であることが判明し、唯一this Cake bug reportごとに、次のメジャーリリースで修正される予定です。

PHP 5.2には、Cakeが重複したクラス名をサポートするために必要な名前空間のサポートはありません。 PHP 5.3には名前空間のサポートがあり、Cake 3.0にはそのバージョンが必要です。

+0

これはまさにCakePHPのバグではありませんが、PHP 5.2の不適切な使い方です。 CakePHP 3で利用できる唯一の理由は、名前空間をサポートするPHP 5.3が必要なためです。 –

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' 
    ) 
); 
+0

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

を、私は私から関連エントリで私の質問を更新しましたroutes.php。それは順番に見えますか? – mensch

+0

あなたが列挙したルートは両方ともプラグインを指しています(したがって、配列のプラグインキー)。しかし、あなたの質問では、あるルートがプラグインのPostコントローラを指している必要があり、別のルートがそのアプリケーションのPostsコントローラを指している必要があると述べています。プラグインにはPostという名前が付いているので、2つのコントローラとPostsというプラグインがありますか? –

+0

また、コントローラの命名規則はCakePHP 2.0で変更されました。コントローラー名を適切に大文字にする必要があります。 –

1

Cakeの標準キャッシュファイル名をオーバーライドして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', 
)); 
?>