Вопрос

У меня есть несколько моделей, которые используют функцию Doctrine nestedset.Я хочу добавить функцию удаления элементов из дерева, поскольку это требуется в моем приложении.Я пытался использовать фрагменты из документации, но я получаю очень странную ошибку с этим кодом.

ЯМЛ здесь: http://pastie.org/820978

И я пытаюсь с помощью этого кода в моем меню class witch расширить сгенерированный абстрактный класс BaseMenu, а BaseMenu расширить Doctrine_Record :)

Во всяком случае, мой код:

 public function getMenuItem($id)
 {
     return Doctrine::getTable('Menu')->find($id);
 }

 public function delete($id)
 {
     $item = $this->getMenuItem($id);

     //echo get_class($item); will return Menu so object exists !?

     $item->getNode()->delete();
 }

И я получаю это сообщение об ошибке:

Фатальная ошибка:Вызов функции-члена getNode() для не-объекта

И я только что заметил, что get_class ($item) вызывает вражду (так что, вероятно, это причина такого странного поведения):

Предупреждение:get_class() ожидает, что параметр 1 будет object, логическое значение задано в...

Однако мне нужно решение для этого, и все подсказки приветствуются...

Это было полезно?

Решение

getNode() возвращает Doctrine_Node, а не Doctrine_Record.

Doctrine_Record может быть удален, но Doctrine_Node не может быть удален - потому что он в любом случае не является постоянным.

Правильная логика была бы просто такой:

$item = $this->getMenuItem($id)->delete();

Кроме того, не называйте метод в вашей модели "удалить"!!Это переопределит метод doctrine_record's delete(), который сведет вас с ума, пытаясь его отладить.

Другие советы

Лично мне не нравится использовать Doctrine::GetTable("имя_таблицы"), потому что это не делает код очень сухим.Если по какой-то причине "имя_таблицы" когда-либо изменится, вам придется изменить его во многих местах.

Я использовал Doctrine в приложениях Zend Framework, поэтому мой типичный шаблон использования включает создание защищенного экземпляра каждой модели в моем модуле.

Используя этот шаблон, я бы просто сделал это в своем контроллере

$this->_Menu
     ->getTable()
     ->find($id)
     ->getNode()
     ->delete();

Если вы действительно хотите сохранить свои функции похожими, я бы использовал что-то вроде этого

 public function getMenuItem($id)
 {
     if (empty($id))
     {
         throw new Exception ("A parameter of id is required to retrieve a menu item".);
     }
     return $this->getTable()->find($id);
 }

 public function delete($id)
 {
     $item = $this->getMenuItem($id);

     if ($item instanceof Doctrine_Record == false)
     {
          throw new Exception("Item is not a valid Menu Record.");
     }

     $item->getNode()->delete();
 }

Ответ содержится в вашем вопросе:$item не является объектом (я предполагаю, что его значение равно false, но вы можете использовать var_dump($item)), потому что в БД нет строки с таким идентификатором (также я предполагаю, что ваш $id равен null)

Предупреждение:get_class() ожидает, что параметр 1 будет object, логическое значение задано в...

Фатальная ошибка:Вызов функции-члена getNode() для не-объекта

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top