我想为我网站的静态页面使用动态路由。
我在我的 Routes 文件中使用了以下代码
$arr = ClassRegistry::init('Page');
和
$this->loadModel('Page');
$arr = $this->Page->find('all');
foreach($arr as $value)
{
//my code
}
但它不起作用,并显示如下错误:
ClassRegistry 未定义
您试图将控制器代码放在您的路由文件中,并打算使您的站点如此不必要地依赖数据库。当然,您的整个站点可能依赖于数据库,但是通过使您的路由依赖于数据库,所有使其到达 cakephp 的请求(这意味着,所有不是 webroot 中的静态文件的请求)都需要与数据库对话至少减慢速度,如果数据库出现任何问题,您的网站对于所有请求都是致命错误的白页。这是因为在请求处理过程的早期就加载了路由文件。路由文件不应该包含任何真正的逻辑 - 只是Router::connect
语句。
如果您有任何可用于静态页面的模式,请使用它以便您只有一个路由定义。IE:
Router::connect('/x/*', array('controller' => 'some', 'action' => 'thing')); //eerily similar to the default static pages route
每当您的路由规则发生更改并将它们写入静态文件时,无论您喜欢什么,都可以构建您的路由逻辑。因此,您的 routes.php 文件变为:
<?php
... routes that don't change ...
require 'path/to/dynamic_routes_file.php';
您可以使用相关模型的 afterSave 处理程序来触发重建此动态路由文件。
还有许多其他方法可以处理这种事情,例如覆盖错误处理过程以首先检查是否有这些依赖于 db 的路由要处理 - 或者简单地创建一个自定义路由类,它可以实现你想要的任何东西。
不管你做什么——目标是运行时的逻辑尽可能简单/缓存/静态——不要构建一个让所有请求都需要一直与数据库对话的系统。