2012-03-30 100 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