修改cakephp中的Routes.php文件

时间:2011-11-15 14:51:51

标签: postgresql cakephp

我不想在此页面中硬编码值,而是想从数据库中选取值并设置主页面。

Router::connect('/', array('controller' => 'tools', 'action' => 'index' ));

而不是控制器和操作的硬编码值我想在postgresql数据库上触发查询并将这些值放在connect语句中。但我无法在routes.php文件中触发查询。

2 个答案:

答案 0 :(得分: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']));

  }

在此示例中,我使用路径模型来创建路线。实际上,这可能是您选择的任何模型。

答案 1 :(得分:1)

另一种方法是插入你的Routes模型afterSave()回调并生成一个缓存版本的路由,类似于(CakePHP2.0):

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;

    }

}

并将以下内容添加到app / Config / routes.php:

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

    require CACHE . 'route_cache.php';

}

这样,仅在保存路由时才会更新routes_cache.php文件,并且您不会在每个页面请求上加载和读取Route表时产生额外的开销。