我有以下模型和控制器文件,当我访问此网址时,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网站上的教程......
由于
答案 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模型的例子。