Неустранимая ошибка при использовании ORD gDoctirne в Codeigniter - PullRequest
0 голосов
/ 14 апреля 2010

Я получаю следующее сообщение об ошибке при использовании Doctrine ORM в 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.0363  3210720 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

------------------ Определение таблицы доктрин -------------

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() {

    }
}

------------------------ Код таблицы доктрин -------------------

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);
    }

}

----------------- Код модели -----------------

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

1 Ответ

3 голосов
/ 14 апреля 2010

Полагаю, что:

  • Shoes extends BaseShoes - хорошо, мы можем видеть, что
  • BaseShoes extends Doctrine_Record

Doctrine_Record имеет метод __construct(), который делает много вещей.

Если вы переопределите метод __construct() в одном из ваших классов, он переопределит метод __construct(), определенный в его родительском классе.


Здесь:

  • ваш Shoes::__construct() метод
  • переопределяет BaseShoes::__construct()
  • который сам не существует, так же, как Doctrine_Record::__construct()
  • , который, кажется, делает некоторые довольно важные вещи, связанные с Доктриной; -)


Не проверено, но вызов конструктора родителя в вашем собственном конструкторе может помочь:

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


И, в качестве ссылки, цитируем Конструкторы и деструкторы страницы руководства по PHP:

Примечание: Родительские конструкторы не вызываются неявно, если дочерний класс определяет конструктор.
Для того, чтобы запустить родительский конструктор, вызов parent::__construct() в пределах требуется дочерний конструктор.


Тем не менее, как замечание, я не уверен, что определение собственного конструктора в классе Model с помощью Doctrine - такая хорошая идея - и я никогда не видел, чтобы это было сделано, насколько я помню ...

А вот блог-пост в блоге Учения , который, кажется, указывает на то, что я прав (цитирую, выделение мое) :

[...] кто-то спросил о конструктор сущностей в Доктрине 2 и может ли он быть использован.
Я думаю, что это что-то стоящее писать о том, как с в Учении 1 это было невозможно. Конструктор был отстранен от вас и использовал внутренне доктриной .


А вот соответствующий раздел руководства Доктрины 1.2: Переопределение конструктора :

Доктрина не позволяет вам отвергать Doctrine_Record::__construct() метод, но предоставляет альтернативу
[...]

...