我最近一直在尝试学习cakephp,但我很难找到任何关于在修改数据后将数据存储到表中的教程。我习惯于完全控制PHP中的所有内容,所以很难适应MVC的自动化过程。
我认为一个很好的第一个实验是接受一个输入并连接一个字母到它(让我们只说"m")。然后,将原始值和连接后的值都存储在一个表中,其中包含字段“original”和" 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);
}
}
?>发布于 2012-03-26 10:00:15
这是关于胖模型/瘦控制器的无休止的争论(或偏好),反之亦然。
就保存而言,模型绝对应该处理这方面的逻辑。不过,您很可能会从控制器调用它,比如$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个
我就是不明白为什么会出现这样的错误:在非对象上调用成员函数
()。
当您从Concatenate类内部调用$this->Concatenate->save时,这意味着您正在尝试访问该类内部的一个名为Concatenate的变量并执行一个函数。当然,这两者都不存在。原因是您需要这样调用对象本身:
$this->save("blah blah");该方法(我假设是来自AppModel类的父方法)将被调用,引用Concatenate对象的当前实例。
https://stackoverflow.com/questions/9865594
复制相似问题