首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >cakephp -修改和保存数据

cakephp -修改和保存数据
EN

Stack Overflow用户
提问于 2012-03-26 09:27:48
回答 1查看 2.7K关注 0票数 2

我最近一直在尝试学习cakephp,但我很难找到任何关于在修改数据后将数据存储到表中的教程。我习惯于完全控制PHP中的所有内容,所以很难适应MVC的自动化过程。

我认为一个很好的第一个实验是接受一个输入并连接一个字母到它(让我们只说"m")。然后,将原始值和连接后的值都存储在一个表中,其中包含字段“original”和" concatenated“。因此,如果我输入"hello",原始字段中的值将是"hello“,连接的字段将是"hellom”。

我的问题是,模型是否负责连接原始值?它是否也会进行节省,或者这是控制员的责任?

这是我的代码:我得到以下错误。致命错误:在第6行对/Applications/XAMPP/xamppfiles/htdocs/cake/app/Model/Concatenate.php中的非对象调用成员函数save()

代码语言:javascript
运行
复制
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');

?>

现在来看模型

代码语言:javascript
运行
复制
class Concatenate extends AppModel {

function saveConcat($original,$concatenated) {
        $this->set(array(
        'original' => $original,
        'concatenated' => $concatenated));
        $this->save();
        }

}

?>

现在来看控制器

代码语言:javascript
运行
复制
<?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);
 }
}
?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-26 10:00:15

这是关于胖模型/瘦控制器的无休止的争论(或偏好),反之亦然。

就保存而言,模型绝对应该处理这方面的逻辑。不过,您很可能会从控制器调用它,比如$myModel->save($data);

在连接值时,我会亲自在控制器中处理,因为它是与模型没有直接关系的业务逻辑。例如,您可能希望连接一个字符串并将其发送到视图。

编辑

免责声明:我几乎没有使用CakePHP的经验,但基本原理是一样的。

你提到你不能让它工作,所以我注意到你的模型中有一个名为Concatenate()的函数。这是PHP4风格的构造函数,不再是“最佳实践”(当然,除非您正在运行PHP4,但您到底为什么要这样做)。事实上,它很可能在不久的将来被完全弃用。构造函数的PHP5方式是使用__construct()函数。如果您决定使用构造函数,我会确保在其中调用parent::__construct();,以确保正确加载父AppController类。

在查看Concatenate()方法的功能时,我怀疑您是否打算将其作为您的构造函数。将该函数重命名为清晰的名称,如saveConcat()。此外,我不确定我是否会使用$this->request->data作为您的源代码,以防您希望能够重用此函数并使用任何值调用它。在这种情况下,我会向函数添加一个参数

代码语言:javascript
运行
复制
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()函数修改为如下所示:

代码语言:javascript
运行
复制
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的变量并执行一个函数。当然,这两者都不存在。原因是您需要这样调用对象本身:

代码语言:javascript
运行
复制
$this->save("blah blah");

该方法(我假设是来自AppModel类的父方法)将被调用,引用Concatenate对象的当前实例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9865594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档