Reputation: 2167
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
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