我不想在此页面中硬编码值,而是想从数据库中选取值并设置主页面。
Router::connect('/', array('controller' => 'tools', 'action' => 'index' ));
而不是控制器和操作的硬编码值我想在postgresql数据库上触发查询并将这些值放在connect语句中。但我无法在routes.php文件中触发查询。
答案 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表时产生额外的开销。