0
votes

I'm new to cakephp, but from what I understand all of the database interaction should take place in the model.

I followed the official cakephp blog tutorial but they use the controller to save, edit, and delete posts instead of the model. http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html

I'm attempting to split up the program so the model takes care of all of the DB interactions. I was able to get it to save new entries, however I can't seem to figure out how to edit them.

Here's the original action used by the official cakephp tutorial for editing posts.

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.');
    }
}
}

So, here's my controller action. My controller name is ConcatenatesController and my model is Concatenate. I originally used this to test out concatenating strings.

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

...and the model that goes with it

 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.');
        }
    }

I'm getting the following errors

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

Line 20 refers to

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

and Line 24 is

  $this->Session->setFlash('Unable to update your post.');
1
This isn't the right way to be doing it; the tutorial documents the way you should be doing it. - sevenseacat
So you're telling me I should be using the controller to interact with the database? - user1104854
The controller isnt interacting with the database. $this->Post->save($this->request->data) it's instructing the model to do it. - sevenseacat

1 Answers

2
votes

The controller isn't interacting with the database directly per-se, it's calling a model to do it for it instead, which is what the point of having controller in the first place.

System specific stuff like Session, Request, FileUpload etc is considered application logic and should be in the controller. The controller then govern how the application should interact with them and not model.

Imagine for Session in PHP you are using $_SESSION, then you have an ApiController for a mobile application you are building but can't possibly rely on $_SESSION since mobile app usually doesn't send cookie, Model shouldn't know or care how Session is managed, it's the Controller responsibility to maintain user state and tell Model to do stuff relating to User.

Another example: saving Post, it's not the model responsibility to know which user is currently logged in, it's the controller responsibility to tell Model which user is logged in, in cake case, by passing fields => array('user_id', $this->Auth->user('id')) when calling $this->User->save().

The documentation is correct in which Controller is (by $this->ModelName->doStuff()) calling Model to do its job rather than "interacting" directly with the db.

Please have a read at these articles, although they are talking about business logic and application logic, the illustration there should get you going :)

Application Logic vs Business Logic