2011-11-15 14 views
1

このページの値をハードコードしたくない代わりに、データベースから値を取り出してメインページを設定します。cakephpのRoutes.phpファイルを変更します

コントローラとアクションのハードコードされた値の代わりに、私はpostgresqlデータベースに対してクエリを実行し、それらの値をconnect文に入れたいと思っています。しかし、私はroutes.phpファイルでクエリを起動できません。

答えて

2

あなたはそうのようなあなたのroutes.phpのにダイナミックルートを定義することができます。この例では

/** 
    * Initialize model and perform find 
    */ 
    $Route = ClassRegistry::init('Route'); 
    $routes = $Route->find('all'); 

    /** 
    * Iterate over results and define routes 
    */ 
    foreach ($routes as $route) { 

    Router::connect('/', array('controller' => $route['Route']['controller'], 'action' => $route['Route']['action'])); 

    } 

、私は私のルートを作成するために ルートモデルを使用しています。実際には、これはあなたの選択の任意のモデルになる可能性があります。

class Route extends AppModel { 

    public function rebuildRouteCache() { 

     $routes = $this->find('all') 

     $routeCache = new File(CACHE . 'route_cache.php', true); 

     $routeCache->write('<?php' . "\n"); 

     foreach($routes as $route) { 

      $parsed = Router::parse($route['Route']['url']); 

      $routeCache->write("Router::connect('" . $route['Route']['route'] . "', array('controller'=>'" . $parsed['controller'] . "', 'action'=>'" . $parsed['action'] . "', '" . $parsed['pass'][0] . "', 'plugin'=>'" . $parsed['plugin'] . "'));\n"); 
     } 

     $routeCache->close(); 

     return true; 

    } 


    public function afterSave($created) { 

     $this->rebuildRouteCache(); 
     return true; 

    } 

} 

アプリ/コンフィギュレーションに次の行を追加します。

+0

ところで、私の答えの例は、すべての私の動的ルートをルートURLに送信します。純粋に、あなたがどのように検索結果を使用できるかを示すことでした。 –

+0

どのフォルダにルートモデルを入れましたか? – user299128

+0

すべてのモデルはapp/models /フォルダに存在する必要があります。 –

1

選択肢は、あなたのルートモデルafterSave()コールバックに差し込むとルートのキャッシュされたバージョンを生成、(CakePHP2.0)のようなものです/routes.php:

if (file_exists(CACHE . "route_cache.php")) { 

    require CACHE . 'route_cache.php'; 

} 

このようにして、ルートを保存するときにroutes_cache.phpファイルは、更新され、あなたは文句を言わないの負荷の追加のオーバーヘッドを持っており、すべてのページ要求にルートテーブルを読み込みます。

+0

おかげさまで、あなたのコードは、実際にはCakeのファイル機能をドキュメントよりも良く使う方法を説明しました。 – AngeloS

関連する問題