2010-04-13 3 views
0

Je reçois un message d'erreur suivant lors de l'utilisation de Doctrine ORM dans Codeigniter.Erreur fatale lors de l'utilisation de gDoctirne ORM dans Codeigniter

(!) Fatal error: Call to a member function getAttribute() on a non-object in C:\xampp\htdocs\giftshoes\system\database\doctrine\Doctrine\Record.php on line 1424 
Call Stack 
# Time Memory Function Location 
1 0.0011 327560 {main}() ..\index.php:0 
2 0.720 require_once('C:\xampp\htdocs\giftshoes\system\codeigniter\CodeIgniter.php') ..\index.php:116 
3 0.0492 3922368 Welcome->Welcome() ..\CodeIgniter.php:201 
4 0.0817 6234096 CI_Loader->model() ..\welcome.php:14 
5 0.0824 6248376 Shoes->__construct() ..\Loader.php:184 
6 0.0824 6248424 Doctrine_Core::getTable() ..\Shoes.php:5 
7 0.0824 6248424 Doctrine_Connection->getTable() ..\Core.php:1080 
8 0.0824 6254304 Doctrine_Table->__construct() ..\Connection.php:1123 
9 0.0841 6396128 Doctrine_Table->initDefinition() ..\Table.php:249 
10 0.0841 6397472 Shoes->__construct() ..\Table.php:301 
11 0.0841 6397680 Doctrine_Access->__set() ..\Access.php:0 
12 0.0841 6397680 Doctrine_Record->set() ..\Access.php:60 

------------------ Doctrine Tableau Définition -------------

abstract class BaseShoes extends Doctrine_Record 
{ 
    public function setTableDefinition() 
    { 
     $this->setTableName('shoes'); 
     $this->hasColumn('sku', 'integer', 11, array('primary' => true, 'autoincrement' => false)); 
     $this->hasColumn('name', 'string', 255); 
     $this->hasColumn('keywords', 'string', 255); 
     $this->hasColumn('description', 'string'); 
     $this->hasColumn('manufacturer', 'string', 20); 
     $this->hasColumn('sale_price', 'double'); 
     $this->hasColumn('price', 'double'); 
     $this->hasColumn('url', 'string'); 
     $this->hasColumn('image', 'string'); 
     $this->hasColumn('category', 'string', 50); 
    } 

    public function setUp() { 

    } 
} 

- ---------------------- Doctrine Table Code -------------------

class ShoesTable extends Doctrine_Table 
{ 
    function getAllShoes($from = 0, $total = 15) 
    { 
     $q = Doctrine_Query::create() 
     ->from('Shoes s') 
     ->limit($total) 
     ->offset($from); 

     return $q->execute(array(), Doctrine::HYDRATE_ARRAY); 
    } 

} 

----------------- Code de modèle -----------------

class Shoes extends BaseShoes 
{ 
    function __construct() { 
     $this->table = Doctrine::getTable('shoes'); 
    } 
    public function getAllShoes() 
    { 
     $this->table->getAllShoes(); 
    } 
} 
+0

une pente à quelle ligne est la ligne 1424 aiderait. – Danten

+0

Le code est formaté maintenant ... 1424 est le numéro de ligne de Doctrine \ Record.php –

+0

Oui, mais quel est le numéro de ligne exact? Postez le morceau de code qui précède immédiatement. – Danten

Répondre

3

Je suppose que:

  • Shoes extends BaseShoes - bien, nous pouvons voir que
  • BaseShoes extends Doctrine_Record

Doctrine_Record a une méthode __construct(), qui fait beaucoup de choses.

Si vous redéfinissez la méthode __construct() dans l'une de vos classes, elle remplacera la méthode __construct() définie dans sa classe parente.


ici:

  • votre méthode Shoes::__construct()
  • BaseShoes::__construct()
  • overrides
  • qui lui-même n'existe pas, donc est le même que Doctrine_Record::__construct()
  • qui semble faire un peu DOCTRINE très important choses liées ;-)


Non testé, mais appeler le constructeur du parent dans votre propre constructeur pourrait aider:

class Shoes extends BaseShoes 
{ 
    function __construct() { 
     parent::__construct(); 
     $this->table = Doctrine::getTable('shoes'); 
    } 
    public function getAllShoes() 
    { 
     $this->table->getAllShoes(); 
    } 
} 


Et, comme référence, citant la page Constructors and Destructors du manuel PHP:

Remarque : Les constructeurs parents ne sont pas appelés implicitement si la classe enfant définit un constructeur.
Pour exécuter un constructeur parent, un appel à parent::__construct() dans le constructeur enfant est requis.


encore, comme sidenote, je ne suis pas sûr que la définition de votre propre constructeur dans une classe de modèle, avec la doctrine, est une bonne idée - et je ne l'ai jamais vu cela, en fait, comme autant que je m'en souvienne ...

Et voici une blog-post on the Doctrine's blog, qui semble indiquer que je ne me trompe pas (citant, Souligné par l'auteur):

[...] quelqu'un a demandé au sujet du constructeur d'entités dans Doctrine 2 et si oui ou non il pourrait être utilisé.
Je pense que cela vaut quelque chose écrit au sujet depuis dans Doctrine 1 cela n'a pas été possible. Le constructeur était salut-Jacked de vous et utilisé en interne par Doctrine.


Et voici la section du manuel de doctrine 1.2 qui est pertinente: Overriding the Constructor:

Doctrine ne vous permet pas de passer outre la méthode Doctrine_Record::__construct() mais fournit une alternative
[... ]

Questions connexes