2014-10-28 25 views
0

如果來自不同控制器的視圖使用相同的元素,要求不同的控制器將相同的數據傳遞給視圖(因此可能進行相同的處理),那麼製作一個視圖會不會更好AJAX調用單個控制器?CakePHP - 使用元素渲染視圖vs ajax

比方說,我們有這樣的:

  • 型號/ post.php中
  • 型號/ user.php的
  • 型號/ Service.php
  • 控制器/ UsersController.php
  • 控制器/ ServicesController.php
  • Views/Users/view.ctp
  • Views/Services/view.ctp
  • 查看/元/ list_users_post.ctp

一個用戶屬於一個服務,用戶有很多帖子。 在Views/Services/view.ctp中,我想要顯示特定服務的每個用戶的列表,以及每個用戶的一些相關信息和他最後10個帖子的列表。 在Views/Users/view.ctp中,我想要顯示用戶的相關信息和他最後10個帖子的列表。 元素Views/Elements/list_users_post.ctp允許我將顯示用戶帖子表的代碼分解。它需要設置var $userPostList,並且結構與$this->Post->find('all', array('conditions' => array('user_id' => $userId)))的結果相同。 因此,在我的UsersController::view($userId)ServicesController::view($serviceId)操作中,我最終得到了一些重複的代碼來檢索用戶的帖子。

我認爲重構代碼以使動作ServicesController::view($serviceId)不以Post模型的任何發現,而是認爲Services/index.ctp使得AJAX調用到行動UsersController::view($userId)爲每個用戶。這樣,沒有更多重複的代碼,但與AJAX調用的開銷。

有什麼想法?

回答

0

在您的情況下避免重複代碼的一種好方法是將其移動到模型圖層。因此,而不是這個控制器:

$this->Post->find('all', array('conditions' => array('user_id' => $userId))) 

你將不得不這樣的控制器:

$this->Post->getUserPosts($userId); 

這在型號:

function getUserPosts($userId){ 
    return $this->find('all', array('conditions' => array('user_id' => $userId))); 
} 

AJAX調用也都一個好的解決方案,但即使對他們來說,如果可能的話,最好還是保留模型中的業務邏輯。

其他方法來避免重複的代碼包括(但不限於):使用 助手在瀏覽 使用控制器 在模型

應該讓你開始在保持你的代碼幹,使用行爲組件。

+0

是的,這已經是一些棘手的發現,要求例如要求幾個模型。但是這並不妨礙在多個控制器中放置相同的代碼(儘可能小)。使用元素的其他缺點之一是變量轉發...當您有嵌套元素時,必須爲頂層元素提供子元素所需的所有變量,因此會嚴重耦合元素。我只看到AJAX來防止這種情況發生,但是,呃,我想知道這個開銷... – paflechien 2014-10-31 13:34:46