我是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 :(得分:2)
控制器本身并不与数据库directly
进行交互,它正在调用模型来代替它,这就是首先拥有控制器的重点。
Session,Request,FileUpload等特定于系统的东西被认为是应用程序逻辑,应该在控制器中。然后,控制器管理应用程序应如何与它们交互而不是模型。
想象一下,你正在使用$_SESSION
的PHP会话,然后你有一个ApiController用于你正在构建的移动应用程序但不能依赖$_SESSION
,因为移动应用程序通常不会发送cookie ,Model不应该知道或关心Session的管理方式,Controller负责维护用户状态并告诉Model执行与User相关的事情。
另一个例子:保存Post,它是not
模型的责任,知道哪个用户当前登录,控制器有责任通过传递{{1}告诉Model哪个用户登录了哪个用户?当调用$ this-> User-> save()。
文档是正确的,其中Controller(通过fields => array('user_id', $this->Auth->user('id'))
)调用Model来完成其工作,而不是直接与db“交互”。
请阅读这些文章,虽然他们正在谈论业务逻辑和应用程序逻辑,但是应该让你继续前进:)