您无需为所有内容创建控制器。事实上,您不应该这样做,因为有更好的解决方法。你拥有的静态页面越多,它就越容易失控。
对于静态页面
将 pages_controller.php 从 cake/libs/controller 文件夹复制到您的 app/controllers 文件夹。将以下代码添加到您的 display() 操作中:
function display() {
...
$page = Inflector::slug($page);
if (method_exists($this, $page)) {
$this->$page();
}
$this->render(join('/', $path));
return;
}
然后,修改您的 routes.php 文件以添加各种静态页面:
Router::connect('/about', array('controller' => 'pages', 'action' => 'display', 'about'));
Router::connect('/contact', array('controller' => 'pages', 'action' => 'display', 'contact'));
现在,联系表单是一个静态页面,但附加了一些逻辑。因此,您可以转到 PagesController 并专门为此(或任何其他不仅仅是静态的页面)创建一个操作:
function contact() {
if (!empty($this->data)) {
...
}
}
基本上,路由会将您的静态页面请求定向到 PagesController 的 display() 操作。显示操作检查是否存在同名方法。如果是,它会执行该操作并显示 pages/{page}.ctp 视图。
对于非静态页面,例如。博客
现在,这肯定需要一个模型。事实上,多个模型(Post hasMany Comment,Post HABTM Tag)。为了操作和访问这些不同的模型,最好将代码放入单独的控制器中。
很多人喜欢根据他们的 URL 来命名他们的控制器。例如,如果他们想要一个 URL,例如/blog,他们将他们的控制器命名为 BlogController。
我更喜欢的一种方法是使用路由来获取我想要的 URL,并根据 CakePHP 约定保持控制器命名。
例如。 PostsController 将控制 Post 模型和相关模型。但是,如果我想让/blog URL 显示所有帖子的列表,我会编写一个指向/posts/index 的路由。
Router::connect('/blog', array('controller' => 'posts', 'action' => 'index'));
您也可以有其他路线。示例:/blog/2010/06/10/whats-in-a-post 指向 /posts/view/。
同样,这只是一个例子。最后,您应该坚持使用您认为有助于为您和您的团队组织代码的方法。