CakePHP在非对象上调用成员函数save()

时间:2014-02-13 21:18:09

标签: php cakephp inflector

让我们从我的代码的简化版本开始:

模型:Sku.php

class Sku extends AppModel {

}

控制器:SkusController.php

class SkusController extends AppController {

    public function admin_add() {

        $this->layout = 'admin';

        if($this->request->is('post')) {
            if($this->Sku->save($this->request->data)) {
                // Do stuff
            }
            else // Do stuff
        }

    }

}

查看:Skus> admin_add.ctp

<?php echo $this->Form->create('Sku', array('type'=>'file')); ?>
<?php echo $this->Form->input('Sku.item_no')); ?>
<?php echo $this->Form->input('Sku.size'); ?>
<?php echo $this->Form->input('Sku.color'); ?>
<button type="submit">Save SKU</button>
<?php echo $this->Form->end(); ?>

当我提交表单时,我收到错误在非对象上调用成员函数save()。在我的控制器文件的开头,如果我添加以下内容,一切正常,并在skus表中插入一个新行。

public $uses = 'Sku';

如果我已经使用了所有正确的命名约定,我不能省略前一行吗?此外,如果我按照相同的命名约定将所有文件和类名更改为Test,则它不使用$ uses变量。这让我相信我的代码中的其他地方存在某种冲突。关于为什么会发生这种情况或在哪里寻找潜在问题的任何建议?

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试以下代码,我认为,它会起作用

模型:Sku.php

class Sku extends AppModel {
  var $name = 'Sku';
}

答案 1 :(得分:0)

编辑:看起来变形器无法将复数变为单数:http://dogmatic69.com/inflector/Skus。因此,您必须使用$ uses或将规则添加到变形器。 See the inflector configuration

您没有为Controller :: $ uses属性使用数组或布尔值。

public $uses = 'Sku';

应该是:

public $uses = array('Sku');

实际上,如果控制器和模型符合惯例,则根本不必定义它。

阅读文档http://api.cakephp.org/2.4/class-Controller.html# $ uses

  

$uses一个数组,包含此控制器的模型的类名   使用

     

示例:public $uses = array('Product', 'Post', 'Comment');

     

可以设置为多个值来表达不同的选项:

     
      
  • true使用默认的变形型号名称。
  •   
  • array()仅使用父类中定义的模型。
  •   
  • false根本不使用任何模型,也不要与父类合并。
  •   
  • array('Post','Comment')仅使用Post和Comment模型。模型也将与父类合并。
  •   
     

默认值为true。