我最近一直在努力学习cakephp,但是我很难找到任何有关在修改后将数据存储到表中的教程。我已经习惯了完全控制PHP中的所有内容,因此一直在努力适应MVC的自动化过程。
我认为一个好的第一个实验是接受输入并连接一个字母(让我们只说“m”)。然后,将原始值和连接值存储在具有“orignal”和“concatenated”字段的表中。所以,如果我输入“hello”,原始字段中的值将为“hello”,并且连接字段将为“hellom”。
我的问题是模型是否应该负责连接原始值?它还能做节约还是控制器的责任?
这是我的代码:我收到以下错误。 致命错误:在第6行的/Applications/XAMPP/xamppfiles/htdocs/cake/app/Model/Concatenate.php中调用非对象的成员函数save()
View/Concatenates/add.php
<h1>Add Something</h1>
<?php
echo $this->Form->create('Concatenate');
echo $this->Form->input('original');
echo $this->Form->end('Add Numbers');
?>
现在为模型
class Concatenate extends AppModel {
function saveConcat($original,$concatenated) {
$this->set(array(
'original' => $original,
'concatenated' => $concatenated));
$this->save();
}
}
?>
现在为控制器
<?php
class ConcatenatesController extends AppController {
public $helpers = array('Html', 'Form');
public $components = array('Session');
public function index() {
$this ->set('concatenates', $this->Concatenate->find('all'));
}
public function add() {
if ($this->request->is('post')) {
$original = $this->request->data['Concatenate']['original'];
$concatenated = $original."m" ;
$this->Concatenate->saveConcat($original,$concatenated);
}
}
function isempty(){ //used to check if there is data in the table. If there isn't any, "no data" will be displayed
$mysorts = $this->Concatenate->find('all');
$this->set('concatenates', $mysorts);
}
}
?>
答案 0 :(得分:1)
这是关于胖模型/瘦身控制器的永无止境的辩论(或偏好),反之亦然。
就保存而言,模型肯定应该处理它的逻辑。虽然,您很可能会从控制器中调用它,如$myModel->save($data);
在连接值时,我会亲自在控制器中处理它,因为它是与模型没有直接关系的业务逻辑。例如,您可能希望连接一个字符串并将其发送到视图。
<强> [编辑] 强>
免责声明:我对CakePHP几乎没有任何经验,但基本原理是相同的。
你提到你无法让它工作,所以我注意到的一件事是你的模型中有一个名为Concatenate()
的函数。这是PHP4风格的构造函数,不再是“最佳实践”(除非你运行PHP4,但为什么你会这样做)。事实上,它很可能在不久的将来完全被弃用。 PHP5构造函数的方式是使用__construct()
函数。如果你决定使用构造函数,我一定要在其中调用parent::__construct();
以确保父 AppController 类正确加载。
在查看Concatenate()
方法的功能时,我怀疑你打算将它作为你的构造函数。将该功能重命名为saveConcat()
之类的明确功能。此外,我不确定我是否会使用$this->request->data
作为您的来源,以防您希望能够重用此函数并使用任何值调用它。在这种情况下,我会在函数
class Concatenate extends AppModel {
function saveConcat($data) {
if ($this->Concatenate->save($data)) {
$this->Session->setFlash('Your post has been saved.');
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('Unable to add your post.');
}
}
}
然后在控制器的某个地方,您必须实际调用此函数。将控制器中的add()
功能修改为:
public function add() {
if ($this->request->is('post')) {
// Put data into array for saving
$data[] = array( 'original' => $this->request->data );
$data[] = array( 'concatenated' => $original."m" );
// Call model function to save it
$this->Concatenate->saveConcat($data);
}
}
[编辑2]
我无法弄清楚为什么我收到错误:在非对象上调用成员函数save()。
当您从Concatenate类内部调用$this->Concatenate->save
时,这意味着您正在尝试访问名为 Concatenate 的类中的变量并执行一个函数。当然,这两者都不存在。原因是你需要像这样调用对象:
$this->save("blah blah");
该方法(我假设是来自AppModel类的父方法)将被称为引用Concatenate
对象的当前实例。