2012-05-02 3 views
1

CakePHP(2.1)アプリケーションでは、私はcacheActionと一緒にテーマを使用しています。たとえば、ビューにアクセスするとき。 /controller/actionのキャッシュファイルはtmp/views/controller_action.phpに保存されます。モバイルURLから同じビューにアクセスすると(m.example.comなど)、私は内部的にテーマ付きのビューで同じアプリを使用して、モバイルデバイスの出力を簡素化します。CakePHP:CacheHelperとテーマビュー

しかし、キャッシュには問題があります。どちらの要求もホスト名とテーマは異なりますが、コントローラ/アクションは同じでキャッシュファイルのファイル名と同じです。したがって、異なるホストやテーマを持つURLにアクセスすると、CakePHPは同じキャッシュファイル(またはより正確には最初のリクエストのキャッシュファイル)を返します。パラメータ(ホスト名やテーマなど)に応じてキャッシュファイルの名前を変更することはできません。

私はCacheHelperのパラメータを変更しようとしましたが、成功しませんでした。 CacheHelperのキャッシュパス/プレフィックスをオンザフライで変更する方法はありますか?または、この動作を実現する別の可能性がありますか?

答えて

1

よりよい解決策:このプレフィックスは、テーマ名や、それらの要求が異なるいくつかの他のパラメータに一致するように適合させることができる

Configure::write('Cache.viewPrefix', 'YOURPREFIX'); 

:CakePHPの2.3は現在、コアの設定でキャッシュ接頭辞をサポートしています。

1

この問題を解決するための唯一の回避策は、以下の手順は次のとおりです。

1)CacheHelperを拡張する独自のMyCacheHelperを作成し、app/View/Helper/CacheHelper.phpに保存します。方法_writeFile()を上書きし、あなたの接頭辞で$パス文字列の列を拡張:

App::uses('Helper', 'Cache'); 
class MyCacheHelper extends CacheHelper 
{ 
    public function _writeFile($content, $timestamp, $useCallbacks = false) 
    { 
    // ... 
    $cache = $prefix.strtolower(Inflector::slug($path)); 
    // ... 
    } 
} 

2)ディスパッチャを拡張する独自のMyDispatcherを作成し、app/Lib/Routing/MyDispatcher.phpに保存します。方法cached()を上書きして、接頭辞の$パス文字列の列拡張:

App::uses('Dispatcher', 'Routing'); 
class MyDispatcher extends Dispatcher 
{ 
    public function cached($path) 
    { 
    // ... 
    $path = $prefix.strtolower(Inflector::slug($path)); 
    // ... 
    } 
} 

3)新しいディスパッチャを使用するために、ファイルapp/webroot/index.phpを変更します。

App::uses('MyDispatcher', 'Routing'); 
$Dispatcher = new MyDispatcher(); 

4)で$helperパラメータを更新コントローラにCacheの代わりにMyCacheを使用してください。

これだけです。少し複雑ですが、期待どおりに動作します!これで$プレフィックスを必要なものに合わせて調整し、一意のキャッシュファイルを作成することができます。異なるドメイン。

関連する問題