2010-12-03 115 views
0

對於cakePHP來說我還是個新鮮事,我想知道'live'網站是如何做到這一點的。cakePHP項目,文件夾,頁面,功能的組織結構

我看到2種可能性:

1)有一個控制器與一羣在其(擴展)的AppController頁(函數)。

2)有許多控制器,每個控制器在其(擴展的)AppController中都有少量的頁面(函數)。

(你可能會得到我的問題了,但我要去說,它以另一種方式太)

我應該把我的聯繫頁面比我的博客頁面單獨的控制器? (我有預感答案是肯定的。)爲什麼?

+0

...和我不能拼寫'組織'廢話lol – jason 2010-12-03 02:52:24

回答

4

您不需要爲一切創建控制器。事實上,你不應該,因爲它有更好的方法。你擁有的靜態頁面越多,它就越容易獲得。

對於靜態頁面從蛋糕/庫/控制器文件夾

複製pages_controller.php到你的app/controllers文件夾中。下面這段代碼添加到您的顯示器()動作:

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()行動。顯示操作檢查是否存在同名的方法。如果是,則執行該操作並顯示頁面/ {page} .ctp視圖。

對於非靜態頁面,例如。博客

現在,這絕對需要一個模型。事實上,多個模型(Post has many comments,Post HABTM Tag)。爲了操作和訪問這些不同的模型,最好將代碼放入一個單獨的控制器中。

很多人喜歡根據他們的URL來命名他們的控制器。例如,他們將其控制器命名爲BlogController如果他們想要一個URL,如/blog

我更喜歡的一種方法是使用路由來獲取我想要的URL,並保持按照CakePHP約定命名的控制器。

例如, PostsController將控制Post模型和相關模型。但是,如果我想讓/blog網址顯示所有帖子的列表,我會寫一條路線將其指向/posts/index

Router::connect('/blog', array('controller' => 'posts', 'action' => 'index')); 

您也可以有其他路線。例如:/blog/2010/06/10/whats-in-a-post指向/posts/view/

再次,這只是一個可能的例子。最後,您應該堅持您認爲有助於爲您和您的團隊組織代碼的方法。

+0

真棒,這是足夠接近我想知道的。另一個有幫助的事情是另一個線程中的人說'胖胖的模型,瘦的控制器',當我讀到這個時,我有''哈哈!'時刻。 – jason 2010-12-03 16:13:21