CakePHP调用非对象上的成员函数

时间:2010-04-12 11:13:32

标签: cakephp

我有以下模型和控制器文件,当我访问此网址时,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 个答案:

答案 0 :(得分:4)

您需要添加var $name = "Poi";来初始化控制器中的类。

我在PHP5中测试过。看来这是必要的。

编辑: 控制器文件名: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

答案 1 :(得分:3)

如果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模型(单数)之间建立正确的关联,这与大多数常见英语的关联方式不同名。

答案 2 :(得分:0)

将代码调整为Cake的复数/单一化规则的另一种选择是相反的:将Cake的规则适用于您的代码:

app/config/inflections.php中,找到$irregularPlural行,并将其更改为:

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

这将指示Cake将“Pois”的单数视为“Poi”。

当更改变形规则时,这是一个很好的选择,可以提高代码其余部分的可读性/可理解性。例如,默认情况下,Cake将“新闻”的单数视为“新”。但是,找到$this->News->find而不是$this->New->find的新闻项更有意义,所以我调整了变形规则。

答案 3 :(得分:-1)

这是一个问题,因为$this->Poi尚未初始化为对象。我不熟悉CakePHP,但是在PoisController或者构造函数的初始化函数中,你应该调用$this->Poi = new Poi();,所以当你尝试调用find()时,在索引操作中,该方法将被调用Poi模型的例子。