cakephp编辑字段值

时间:2012-03-30 01:01:56

标签: php mysql 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.');

1 个答案:

答案 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“交互”。

请阅读这些文章,虽然他们正在谈论业务逻辑和应用程序逻辑,但是应该让你继续前进:)

Application Logic vs Business Logic