Доктрина nestedset delete

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

YAML находится здесь: http://pastie.org/820978

И я пытаюсь использовать этот код в своем классе меню, который расширяет сгенерированный абстрактный класс 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 будет объектом, логическим значением, заданным в ...

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


person Splendid    schedule 11.02.2010    source источник


Ответы (3)


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

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

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

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

Кроме того, не называйте метод в вашей модели «удалением» !! Это переопределит метод delete () Doctrine_Record, что сведет вас с ума, пытаясь отладить его.

person Mark E. Haase    schedule 27.02.2010

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

Я использовал 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();
 }
person Travis    schedule 12.02.2010
comment
Спасибо за подсказки по кодированию, но это не решает мою проблему, поскольку я получаю исключение. Элемент не является действительной записью меню. У вас есть идеи, как решить эту проблему и почему это вообще не Doctrine_Record? - person Splendid; 12.02.2010

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

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

Неустранимая ошибка: вызов функции-члена getNode () для не-объекта

person Vladimir Mihailenco    schedule 12.02.2010
comment
Чувак, ты читал мой вопрос !? Я могу получить доступ ко всем атрибутам $ item. Также get_class ($ item) возвращает Menu, которое сбивает с толку, но Menu - это класс и похоже на объект: P И, конечно, id не равен нулю, поскольку я просто тестирую приложение, которого нет на каком-то живом веб-сайте или что-то в этом роде. - person Splendid; 14.02.2010
comment
Итак, как вы можете объяснить это: Неустранимая ошибка: вызов функции-члена getNode () для не-объекта - person Vladimir Mihailenco; 14.02.2010
comment
Честно говоря, я не могу это объяснить, и это сбивает с толку, так как я не знаю, где ошибка. Я не понимаю, как я могу получить доступ к таким атрибутам объекта, как $ menu- ›title, с помощью этого кода. У вас есть фрагмент с вложенным деревом наборов и функцией удаления, так как я не могу заставить его работать? - person Splendid; 15.02.2010
comment
Предоставленный код правильный. Я могу только порекомендовать вам убедиться, что ваша среда установлена ​​на error_reporting (E_ALL); ini_set ('display_errors', истина); и проверьте вывод на наличие всех ошибок. - person Vladimir Mihailenco; 15.02.2010