CakePHP Вызов функции-члена save() для необъекта

Начнем с упрощенной версии моего кода:

Модель: 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, следуя тем же соглашениям об именах, это будет работать без переменной $ users. Это заставляет меня поверить, что у меня есть какой-то конфликт в другом месте моего кода. Любые предложения относительно того, почему это может происходить или где искать потенциальную проблему?

Заранее спасибо!

2 ответа

Решение

Редактировать: Похоже, что инфлектор не может превратить множественное число в единственное число: http://dogmatic69.com/inflector/Skus. Так что либо вы должны использовать $ использование, либо вы добавляете правило к инфлектору. Смотрите конфигурацию инфлектора.

Для свойства Controller::$ вы не используете массив или логическое значение.

public $uses = 'Sku';

Должно быть:

public $uses = array('Sku');

На самом деле вам вообще не нужно его определять, если контроллер и модель соответствуют соглашениям.

Прочитайте документацию http://api.cakephp.org/2.4/class-Controller.html$ использует

$uses Массив, содержащий имена классов моделей, которые использует этот контроллер.

Пример: public $uses = array('Product', 'Post', 'Comment');

Может быть установлено несколько значений для выражения различных опций:

  • true Использовать название модели по умолчанию.
  • array () Использовать только модели, определенные в родительском классе.
  • false Не используйте модели вообще, не объединяйте также с родительским классом.
  • массив ('Post', 'Comment') Используйте только модели Post и Comment. Модели также будут объединены с родительским классом.

Значение по умолчанию верно.

Попробуйте следующий код, я думаю, он будет работать

Модель: Sku.php

class Sku extends AppModel {
  var $name = 'Sku';
}
Другие вопросы по тегам