user1104854
user1104854

Reputation: 2167

cakephp editing fields values

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

Upvotes: 0

Views: 1900

Answers (1)

Andreas Wong
Andreas Wong

Reputation: 60594

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

Upvotes: 2

Related Questions