2010-04-12 93 views
3

我有以下的模型和控制器的文件,當我訪問這個URL,http://....../pois/index我得到這個錯誤:CakePHP的調用成員函數的非對象

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的網站上的教程以下...

謝謝

回答

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模型(單數)之間建立正確的關聯關係,它對於大多數常見的英文名稱都是如此。

+0

嗯,這說明了很多 - Poi是興趣點的縮寫 - 我想我可以省下一些打字的工作,但是,如果我要使用PointOfInterest,那麼模型/控制器的名稱是什麼?這個複數的東西真是令人困惑......謝謝。 – joec 2010-04-12 13:12:36

+0

Eeks。我從來沒有成爲我模特中縮寫詞的粉絲,因爲他們應該引用一個「事物」。我可能會把它稱爲'Location'(帶有'LocationsController')或其他一些對約定更友好的東西。正如我上面提到的,雖然,你可以通過告訴Cake如何變換一個給定的名字來定製你的變化。 – 2010-04-12 13:27:40

+0

FWIW,我猜想就Cake而言,'PointOfInterest'的複數將是'PointOfInterests',但您可以複製上面的代碼並進行足夠輕鬆的測試。我沒有嘗試過。 – 2010-04-12 13:31:28

-1

這是一個問題,因爲$this->Poi尚未初始化爲對象。我不熟悉CakePHP,但是在PoisController或構造函數的init函數中,您應該調用$this->Poi = new Poi();,以便在索引操作中嘗試調用find()時,該方法將在Poi模型的實例上調用。

+0

根據CakePHP教程,沒有必要這樣做,因爲它自動處理。本教程的博客示例適用於我,但這個沒有,儘管所有的變化都是這個名字,謝謝 – joec 2010-04-12 11:24:28

+0

你是否檢查過包含路徑?如果CakePHP使用自動加載器,你應該提供查找模塊的路徑,我不確定CakePHP是如何實現的,但目前你的模型未初始化。 – 2010-04-12 11:30:24

+0

我有另一個模型和控制器稱爲類別,它按預期工作,在同一個目錄中,所以包含路徑不應該是一個問題。 – joec 2010-04-12 11:36:12

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,名稱

而且使用/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 
+0

你能夠測試它的名字'Poi'? – joec 2010-04-12 12:27:44

+0

是的,沒錯。 – Young 2010-04-12 12:37:35

+0

它不適合我嗎?你有什麼名稱控制器/模型/數據庫表/視圖? – joec 2010-04-12 12:45:32

0

來適應你的代碼Cake的pluralising替代/ singularising規則是相反的:適應蛋糕的規則,你的代碼:

app/config/inflections.php,找到$irregularPlural線,並將其更改爲:

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

這將指示蛋糕把「Pois」的單數當作「Poi」。「

這是一個很好的選擇,當改變變形規則可以提高代碼其餘部分的可讀性/可理解性時,例如,默認情況下,Cake將單詞」News「視爲」New「。更有意義的是,我發現$this->News->find$this->New->find更有意義,所以我調整了變形規則。

+0

爲了論證的緣故,我按照你的建議改變了變形規則,而且碰巧忘記改變我的數據庫表。這彈出了CakePHP消息 - Model'Pois'缺少'數據庫表'pois'。它建議的數據庫表是正確的(複數),但它仍然將我的模型作爲複數處理,儘管模型應該是單數的......這是「類Poi擴展AppModel」。 – joec 2010-04-13 19:39:57

相關問題