cakephp - 修改和保存数据

时间:2012-03-26 01:27:48

标签: php mysql cakephp

我最近一直在努力学习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);
 }
}
?>

1 个答案:

答案 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对象的当前实例。