2012-03-30 5 views
0

Я новичок в cakephp, но из того, что я понимаю, все взаимодействие с базой данных должно происходить в модели.значения полей редактирования cakephp

Я следил за официальным учебным блогом cakephp, но они используют контроллер для сохранения, редактирования и удаления сообщений вместо модели. http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html

Я пытаюсь разделить программу, чтобы модель заботилась обо всех взаимодействиях с БД. Я смог получить его, чтобы сохранить новые записи, однако я не могу понять, как их редактировать.

Это оригинальное действие, используемое официальным учебным пособием для редактирования постов.

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

Это не правильный путь делать это; учебник документирует то, как вы должны это делать. – sevenseacat

+0

Значит, вы говорите мне, что я должен использовать контроллер для взаимодействия с базой данных? – user1104854

+0

Контроллер не взаимодействует с базой данных. '$ this-> Post-> save ($ this-> request-> data)' он инструктирует модель сделать это. – sevenseacat

ответ

2

Контроллер не взаимодействует с базой данных directly per-se, он вызывает модель, чтобы сделать это вместо нее, и это то, что точка с контроллером в первую очередь.

Системные данные, такие как Session, Request, FileUpload и т. Д., Считаются прикладной логикой и должны находиться в контроллере. Затем контроллер определяет, как приложение должно взаимодействовать с ними, а не моделировать.

Представьте сессии в PHP вы используете $_SESSION, то у вас есть ApiController для мобильного приложения вы строите, но не может полагаться на $_SESSION поскольку мобильное приложение обычно не отправляет куки, модель не должна знать, или заботятся о том, как выполняется управление сеансом, ответственность Контролера заключается в том, чтобы поддерживать состояние пользователя и сообщать модели о вещах, относящихся к Пользователю.

Другой пример: сохранение Post, это not модель ответственность, чтобы знать, какой пользователь в данный момент вошли в систему, это ответственность контроллера сказать модели, какой пользователь вошел в систему, в тортом случае, пропусканием fields => array('user_id', $this->Auth->user('id')) при вызове $ this-> User-> сохранить().

Документация правильная, в которой контроллер (по $this->ModelName->doStuff()) вызывает модель для выполнения своей работы, а не «взаимодействия» непосредственно с db.

Пожалуйста, прочитанная в этих статьях, хотя они говорят о бизнес-логике и логике приложения, иллюстрация должна получить ты :)

Application Logic против Business Logic

+0

Спасибо за объяснение. – user1104854

Смежные вопросы