Ошибка CakePHP: вызов функции-члена create() при переполнении стека, не являющегося объектом

#php #oop #cakephp

#php #ооп #cakephp

Вопрос:

В настоящее время я изучаю, как использовать CakePHP.

Я создал функцию в своем пользовательском контроллере следующим образом:

 class FormatsController extends AppController
{
    // ....

    function admin_add()
    {

        // if the form data is not empty
        if (!empty($this->data)) {
            // initialise the format model
            $this->Format->create();
            // create the slug
            $this->data['Format']['slug'] = $this->slug($this->data['Format']['name']);
            // try saving the format
            if ($this->Format->save($this->data)) {
                // set a flash message
                $this->Session->setFlash('The Format has been saved', 'flash_good');
                // redirect
                $this->redirect(array('action' => 'index'));
            } else {
                // set a flash message
                $this->Session->setFlash('The Format could not be saved. Please, try again.', 'flash_bad');
            }
        }
    }

}
  

Однако, на мой взгляд, я получаю эту ошибку:

Ошибка: вызов функции-члена create() при не-объектном

Чем вызвана эта ошибка и как я могу ее исправить?

Приношу свои извинения, я полагаю, что строка, на которую она ссылается, находится не в контроллере, а в самом моем представлении. Это относится к моему представлению, которое имеет следующую строку:

 <?php echo $form->create('Format');?>
  

Есть ли что-то еще, что мне нужно объявить перед использованием этого? т.Е. $this->Format->create();

Комментарии:

1. Обратитесь к моему ответу ниже .. вы должны использовать этот $this-> Form-> create(‘Format’); удалите свой <?php echo $form->create(‘Format’);?> и замените его на <?php echo $this-> Form-> create(‘Format’);?> $ form — это тот, который вызывает ошибку.

2. В вашем текущем контроллере вы должны проверить свойство, $uses подобное этому public $uses = array('User', .. ); , Мы должны вызвать model User перед использованием.

Ответ №1:

вы должны использовать:

   $this->Form->create('Format');
  

удалите

  <?php echo $form->create('Format');?> 
  

и замените его на

  <?php echo $this->Form->create('Format');?> 
  

$form — это тот, который вызывает ошибку.

Комментарии:

1. @Imran проверьте этот ответ

2. Я использовал то, что вы сказали, и это сработало, но в книге, которую я читал, говорилось, что правильным был другой способ. На самом деле эта книга 2008 года, так что с 2008 года, вероятно, многое изменилось. Спасибо.

3. @IWannaKnow Да, в cake было много обновлений 🙂 Вы должны проверить их официальную документацию book.cakephp.org/2.0/en/index.html

4. У меня была такая же проблема после прочтения книги «Разработка приложений CakePHP». Но также возникли проблемы с именованием файлов и папок. Похоже, CakePHP меняется довольно часто.

5. @theme это правда, вот почему иногда я прибегал к методу проб и ошибок, а иногда читал другие ресурсы помимо руководства и других книг по cake.

Ответ №2:

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

Например: моя модель является пользовательской

 class User extends AppModel {
    var $name = 'User';

    function myfunction ($id) {
                  .....
        }
}
To use in controller
Controller: 

class UsersController extends AppController
{
    function test()
    {
      $this->User->myfunction();
        ......
    }
}
  

Я надеюсь, что это поможет вам!

Комментарии:

1. Может быть, я определил это во множественном числе var $name = 'Formats'; ? Все другие функции работают, несмотря на это, такие как $formats = $this->Format->find('all', array('conditions' => array('status' => 1)));

Ответ №3:

Вероятно, это вызвано тем, что по какой-то причине $this-> Format не создается. Если вы посмотрите в свой фрагмент кода, вы увидите, что он вызывает функцию create(). Добавьте это в качестве инструкции отладки в вашу функцию контроллера перед вызовом create(), чтобы проверить, установлено ли оно вообще.

 debug( isset( $this->Format ) );
  

Если оно установлено, должно выводиться значение true. Если вы попробуете это, дайте мне знать, что это говорит, у меня могут быть другие предложения, чтобы перейти оттуда.

Комментарии:

1. Контроллер формата действительно существует, вызываются и успешно загружаются другие функции (т. е. просмотр и индексирование). Я думал, что использование имен во множественном числе могло быть проблемой (его название FormatsController), но если другие функции могут быть загружены, это не может быть проблемой?

2. Это не FormatsController.php что вам нужно убедиться, что это модель Format.php который, согласно вашему коду, хранится в $this->Format. Этот объект, похоже, не определен, и вам нужно протестировать, чтобы убедиться в этом.

3. Метод, вызванный Format.php был определен, он содержит эту строку: var $name = 'Format';

Ответ №4:

Вы создали модель «Формат»? Такого рода ошибки возникают, когда у вызываемой модели возникает проблема. Либо она не создана, либо создана неправильно, либо она не импортирована / инициирована должным образом.

Если вы объявили переменную $uses в своем контроллере, убедитесь, что вы включили «Format» в свой массив $ uses наряду с другими моделями.

Ответ №5:

Попробуйте это в своем действии

 $this->loadModel('Format');
  

Ответ №6:

 $this->Format
  

не определено (поэтому его значение равно null), нулевой объект не имеет функций, поэтому вы не можете использовать

 $this->Format->create();
  

Это в значительной степени равно

 null->create();
  

Ответ №7:

Попробуйте

 $this->Form->create(null,['url' => ['controller' => 'yourController', 'action' => 'yourAction']])