2012-03-30 107 views
0

我是cakephp的新手,但從我所瞭解的所有數據庫交互應該發生在模型中。cakephp編輯字段值

我遵循官方cakephp博客教程,但他們使用控制器保存,編輯和刪除帖子,而不是模型。 http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html

我試圖分解程序,所以模型負責所有的數據庫交互。我能夠得到它來保存新的條目,但我似乎無法弄清楚如何編輯它們。

以下是官方cakephp教程用於編輯帖子的原始動作。

public function edit($id = null) { 
$this->Post->id = $id; 
if ($this->request->is('get')) { 
    $this->request->data = $this->Post->read(); 
} else { 
    if ($this->Post->save($this->request->data)) { 
     $this->Session->setFlash('Your post has been updated.'); 
     $this->redirect(array('action' => 'index')); 
    } else { 
     $this->Session->setFlash('Unable to update your post.'); 
    } 
} 
} 

所以,這是我的控制器操作。我的控制器名稱是ConcatenatesController,我的模型是Concatenate。我最初用它來測試串聯字符串。

public function edit($id = null) { 
    $this->Concatenate->id = $id; 
    $this->Concatenate->editPost($id); 
}    

...這與它

function editPost($id){ 
    if ($this->save($this->request->data)) { 
     $this->Session->setFlash('Your post has been updated.'); 
     $this->redirect(array('action' => 'index')); 
    } else { 
     $this->Session->setFlash('Unable to update your post.'); 
     } 
    } 

我收到以下錯誤

Notice (8): Trying to get property of non-object [APP/Model/Concatenate.php, line 20] 
Fatal error: Call to a member function setFlash() on a non-object in /Applications/XAMPP/xamppfiles/htdocs/cake/app/Model/Concatenate.php on line 24 

線20轉到模型是指

if ($this->save($this->request->data)) { 

和24行是

$this->Session->setFlash('Unable to update your post.'); 
+0

這是不正確的方式正在做;本教程記錄了您應該如何做的方式。 – sevenseacat 2012-03-30 01:05:52

+0

所以你告訴我我應該使用控制器與數據庫交互? – user1104854 2012-03-30 01:07:28

+0

控制器不與數據庫交互。 '$ this-> Post-> save($ this-> request-> data)'它指示模型去做。 – sevenseacat 2012-03-30 01:34:54

回答

2

控制器本身沒有與數據庫directly進行交互,而是調用一個模型來替代它,這就是控制器擺在首位的原因。

系統特定的東西,如會話,請求,FileUpload等被視爲應用程序邏輯,應該在控制器中。然後控制器控制應用程序應該如何與它們交互而不是模型。

想象一下,在會話PHP您使用$_SESSION,那麼你對你正在建設,但不可能依靠$_SESSION因爲移動應用程序通常不發送的cookie的移動應用程序的ApiController,模型不應該知道或關心Session是如何管理的,Controller負責維護用戶狀態並告訴Model執行與User相關的內容。

另一個例子:保存Post,它是not知道哪個用戶當前登錄的模型責任,控制器責任告訴Model哪個用戶登錄,在cake case中,調用$ this->時通過fields => array('user_id', $this->Auth->user('id')),用戶>保存()。

該文檔是正確的,控制器(由$this->ModelName->doStuff())調用模型來完成它的工作,而不是直接與數據庫「交互」。

請有過這些文章的讀,雖然他們都在談論業務邏輯和應用邏輯,插圖也應該讓你去:)

Application Logic VS Business Logic

+0

感謝您的解釋。 – user1104854 2012-03-30 02:03:38