我最近一直在努力学习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);
}
}
?>
最佳答案
这是关于胖型/瘦型控制器的永无休止的争论(或偏好),反之亦然。
就储蓄而言,该模型绝对应该处理这方面的逻辑。不过,您很可能会从控制器调用它,比如$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
对象的当前实例。关于php - cakephp-修改和保存数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9865594/