我是 cakePHP 的新手,我想知道一个“实时”网站是如何做到这一点的。
我看到了两种可能性:
1)在其(扩展的)AppController 中有一个带有一堆页面(功能)的控制器。
2)有很多控制器,每个控制器在其(扩展的)AppController中都有少量的页面(功能)。
(你可能已经得到我的问题了,但我也会用另一种方式说出来)
我应该把我的联系页面放在一个单独的控制器中而不是我的博客页面吗?(我有一种预感,答案是肯定的。)为什么?
我是 cakePHP 的新手,我想知道一个“实时”网站是如何做到这一点的。
我看到了两种可能性:
1)在其(扩展的)AppController 中有一个带有一堆页面(功能)的控制器。
2)有很多控制器,每个控制器在其(扩展的)AppController中都有少量的页面(功能)。
(你可能已经得到我的问题了,但我也会用另一种方式说出来)
我应该把我的联系页面放在一个单独的控制器中而不是我的博客页面吗?(我有一种预感,答案是肯定的。)为什么?
您不需要为所有内容创建控制器。事实上,您不应该这样做,因为有更好的解决方法。您拥有的静态页面越多,它就越失控。
对于静态页面
将 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 来命名他们的控制器。例如,如果他们想要一个诸如/blog
.
我更喜欢的一种方法是使用路由来获取我想要的 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/
.
同样,这只是可能的示例。最后,你应该坚持那些你认为有助于保持你和你的团队的代码井井有条的方法。