CakePHP вызов функции-члена для необъекта - PullRequest
3 голосов
/ 12 апреля 2010

У меня есть следующие файлы модели и контроллера, и когда я посещаю этот URL, http://....../pois/index я получаю эту ошибку:

Notice (8): Undefined property: PoisController::$Poi [APP/controllers/pois_controller.php, line 5]

Fatal error: Call to a member function find() on a non-object in /home/joecoyle/public_html/app/controllers/pois_controller.php on line 5

Модель такая, называется poi.php:

<?php
class Poi extends AppModel {

}
?>

И это контроллер по имени pois_controller.php

<?php
class PoisController extends AppController {

    function index(){
            $this->set('pois',$this->Poi->find('all'));
    }
}
?>

Поскольку я новичок в CakePHP, я не уверен, что вызывает эту ошибку, так как все, кажется, названо, верно, и я следую учебному пособию на сайте CakePHP ...

Спасибо

Ответы [ 4 ]

4 голосов
/ 12 апреля 2010

Вам нужно добавить var $name = "Poi"; для инициализации вашего класса в контроллере.

И я проверял это в PHP5. Кажется, что это необходимо.

Edit: имя файла контроллера: pois_controller.php, код:

 <?php
 class PoisController extends AppController
 {
       var $name = "Poi";
       function index()
       {
           debug($this->Poi);
           exit;
       }
 }
 ?>

имя базы данных: pois.Structure: id, name

И, используя /pois/, получите:

Poi Object
(
[name] => Poi
[useDbConfig] => default
[useTable] => pois
[displayField] => name
[id] => 
[data] => Array
    (
    )

[table] => pois
[primaryKey] => id
[_schema] => Array
    (
        [id] => Array
            (
                [type] => integer
                [null] => 
                [default] => 
                [length] => 11
                [key] => primary
            )

        [name] => Array
            (
                [type] => integer
                [null] => 
                [default] => 
                [length] => 11
            )
   ...etc
3 голосов
/ 12 апреля 2010

Если решение SpawnCxy не выполняет свою работу (мои собственные контроллеры устанавливают для свойства name множественную версию, а не единственное изменение, которое принимает модель), взгляните на перегиб. «Poi» не является «обычным» словом, и быстрый тест говорит мне, что CakePHP 1.2.6 не обрабатывает это слово так, как вы думаете:

echo '<p>' . Inflector::singularize( 'Pois' ) . '</p>'; # prints "Pois"
echo '<p>' . Inflector::pluralize( 'Poi' ) . '</p>';    # prints "Pois"

Суть этого, конечно, в том, что Cake, возможно, не устанавливает правильную связь между PoisController (множественное число) и Poi модель (единственное), как это происходит для большинства распространенных английских имен.

0 голосов
/ 12 апреля 2010

Альтернативой адаптации вашего кода к правилам плюрализации / сингуляризации Cake является обратное: адаптация правил Cake к вашему коду:

В app/config/inflections.php найдите строку $irregularPlural и измените ее на:

$irregularPlural = array('poi'=>'pois');

Это даст команду Cake относиться к единственному слову "Pois" как к "Poi".

Это хороший выбор, когда изменение правил перегиба создает лучшую читаемость / понятность остальной части вашего кода. Например, по умолчанию Cake обрабатывает единственное число «Новости» как «Новое». Однако было больше смысла находить новости с $this->News->find, чем $this->New->find, поэтому я настроил правила перегиба.

0 голосов
/ 12 апреля 2010

Это проблема, потому что $this->Poi не был инициализирован как объект. Я не знаком с CakePHP, но в вашей функции инициализации в PoisController или в конструкторе вы должны вызывать $this->Poi = new Poi();, поэтому в действии index при попытке вызвать find() метод будет вызываться на экземпляре модели Poi. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...