CakePHP appel à la fonction membre non-objet
J'ai le Modèle suivant et Contrôleur de fichiers, et lorsque je visite cette url, http://....../pois/index
, j'obtiens cette erreur:
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
Le Modèle est celle-ci, appelée poi.php
:
<?php
class Poi extends AppModel {
}
?>
Et le contrôleur est ce, nommée pois_controller.php
<?php
class PoisController extends AppController {
function index(){
$this->set('pois',$this->Poi->find('all'));
}
}
?>
Comme je suis nouveau sur CakePHP, je ne suis pas sûr de ce qui est à l'origine de cette erreur, que tout semble être nommé, la droite, et je suis le tutoriel sur le site CakePHP...
Grâce
OriginalL'auteur joec | 2010-04-12
Vous devez vous connecter pour publier un commentaire.
Si SpawnCxy la solution de ne pas faire le travail (mon propre contrôleurs de jeu de la
name
propriété de la marque du pluriel version plutôt qu'au singulier variation que le modèle prend), prendre un coup d'oeil à l'inflexion. "Pi" n'est pas un "bien commun" parole et un test rapide me dit que CakePHP 1.2.6 ne gère pas ce mot de la façon dont vous êtes en train de penser:Le point de cela, bien sûr, c'est que le Gâteau ne rend pas la bonne association entre la
PoisController
(au pluriel) et lePoi
modèle (singulier) de la façon dont il fonctionne sur la plupart des noms anglais.Eeks. Je n'ai jamais été un fan de sigles dans mes modèles, car ils sont censés faire référence à une "chose". Je pourrais tout aussi bien l'appeler
Location
(avec unLocationsController
), ou quelque chose d'un peu plus respectueux de la convention. Comme je l'ai mentionné ci-dessus, cependant, vous pouvez personnaliser votre inflexions en disant Gâteau de façon à infléchir un nom donné.FWIW, je soupçonne que le pluriel de
PointOfInterest
seraitPointOfInterests
autant que le Gâteau est concerné, mais vous pouvez copier le code ci-dessus et de tester assez facilement. Je n'ai pas l'essayer.OriginalL'auteur Rob Wilkerson
Vous avez besoin d'ajouter
var $name = "Poi";
pour initialiser votre classe dans le contrôleur.Et je l'ai testé qu'en PHP5.Il semble que cela est nécessaire.
Edit:
contrôleur de fichier name:pois_controller.php code:
nom de base de données:pi.Structure:id ,nom
Et à l'aide de
/pois/
a:Poi
?ouais,c'est vrai.
Sa ne fonctionne pas pour moi? Les noms que vous avez pour contrôleur / modèle / table de base de données/ view?
..ainsi,voir mise à jour.
le modèle n'est pas nécessaire.
OriginalL'auteur Young
Une alternative à l'adaptation de votre code à Cake pluralising/singularising règles est l'inverse: l'adaptation d'un Gâteau de règles à votre code:
Dans
app/config/inflections.php
, trouver le$irregularPlural
ligne, et à le modifier:Ceci indiquera à Gâteau pour traiter le singulier de "Pois" comme les "Poi."
C'est un bon choix lors de la modification de l'inflexion règles permet d'avoir une meilleure lisibilité/compréhension du reste de votre code. Par exemple, par défaut, les gâteaux, le singulier de "la nouvelle" la "Nouvelle". Cependant, il ne fait plus de sens pour trouver des articles d'actualités avec
$this->News->find
que$this->New->find
, j'ai donc modifié les règles d'inflection.database table 'pois' missing for Model 'Pois'
. La table de base de données, c'est correct (au pluriel), mais sa reste le traitement de mon modèle comme au pluriel, même si le modèle doit être au singulier... qui c'estclass Poi extends AppModel
.OriginalL'auteur Daniel Wright
C'est un problème parce que
$this->Poi
n'a pas été initialisé comme un objet. Je ne suis pas familier avec CakePHP, mais dans la fonction init dans le PoisController ou dans le constructeur, vous devez appeler$this->Poi = new Poi();
donc dans l'action index lorsque vous essayez d'appelerfind()
, la méthode sera appelée sur une instance de Pi modèle.Avez-vous vérifié votre chemin? Si CakePHP utilise un chargeur automatique vous devez fournir le chemin d'accès où regarder pour votre modules. Je ne suis pas sûr de savoir comment CakePHP t-il, mais pour le moment, votre modèle n'est pas initialisé.
J'ai un autre Modèle et Contrôleur appelée Catégorie qui fonctionne comme prévu, dans le même répertoire, afin d'inclure les chemins ne devrais pas être un problème.
N'est pas votre Contrôleur censé ressembler à cela?
class PoisController extends AppController { var $name = 'Poi'; (...)
c'est facultatif, je crois, de traiter avec php4, mais im en utilisant php5
OriginalL'auteur Bogdan Constantinescu