【问题标题】:cakePHP project, orgazization of folders, pages, functionscakePHP 项目,文件夹、页面、函数的组织
【发布时间】:2010-12-03 02:46:49
【问题描述】:

我是 cakePHP 新手,我想知道“实时”网站是如何做到这一点的。

我看到了两种可能性:

1) 在它的(扩展的)AppController 中有一个带有一堆页面(功能)的控制器。

2) 控制器有很多,每个控制器在其(扩展的)AppController 中都有少量的页面(功能)。

(你可能已经知道我的问题了,但我也打算换个方式说)

我应该把我的联系页面放在一个单独的控制器中而不是我的博客页面吗? (我有一种预感,答案是肯定的。)为什么?

【问题讨论】:

  • ...我不能为垃圾拼写“组织”,哈哈

标签: cakephp controller project-organization


【解决方案1】:

您无需为所有内容创建控制器。事实上,您不应该这样做,因为有更好的解决方法。你拥有的静态页面越多,它就越容易失控。

对于静态页面

将 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/

同样,这只是一个例子。最后,您应该坚持使用您认为有助于为您和您的团队组织代码的方法。

【讨论】:

  • 太棒了,这与我想知道的很接近。另一件有帮助的事情是另一个线程中的某个人说“胖模型,瘦控制器”,当我读到这篇文章时,我有我的“啊哈!”时刻。
  • 非常好的答案,我从中学到了很多。比蛋糕书好
  • 这将如何工作。我的索引页面位于页面控制器中,我希望在其上有一个简单的表单,允许用户注册时事通讯。我不想创建一个索引控制器来处理表单提交。在表单创建方法中,我可以这样做 $this->Form->create('Page',array('action'=>'newsletter')) 其中 newsletter 是我的页面控制器中的一个方法吗?
  • 是的,你可以。但是您需要在 FormHelper::create 中使用 'url' 选项,而不是 'action' - $this->Form->create('Page', array('url' => array('action' => 'newsletter'))) -- 如果您需要更多帮助,最好单独提出一个问题。
猜你喜欢
  • 2010-12-03
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多