Frage

Ich habe einige Modelle, die Hexen verwenden, die Doctrine Nestset -Funktion verwenden. Ich möchte die Löschfunktion von Elementen aus dem Baum hinzufügen, da dies in meiner Anwendung erforderlich ist. Ich habe mit Ausschnitten aus der Dokumentation versucht, aber ich bekomme einen sehr seltsamen Fehler mit diesem Code.

Yaml ist hier: http://pastie.org/820978

Und ich versuche mit diesem Code in meiner Menüklasse Witch erweitert generierte abstrakte Klasse Basemenu und Basemenu erweitert Doctrine_Record :)

Wie auch immer, mein Code:

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

Und ich bekomme einen Fehler:

Tödlicher Fehler: Rufen Sie eine Mitgliedsfunktion getNode () auf einem Nicht-Objekt auf

Und ich habe gerade bemerkt, dass Get_Class ($ item) einen Krieger abspricht (so dass wahrscheinlich ein Grund für dieses seltsame Verhalten ist):

WARNUNG: get_class () erwartet, dass Parameter 1 Objekt ist, boolean in ...

Ich brauche jedoch eine Lösung dafür und alle Hinweise sind willkommen ...

War es hilfreich?

Lösung

getNode () gibt einen doctrine_node zurück, nicht einen doctrine_record.

Ein Doctrine_Record kann gelöscht werden, aber ein Doctrine_Node kann nicht gelöscht werden - weil es ohnehin nicht dauerhaft ist.

Die richtige Logik wäre einfach:

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

Nennen Sie auch keine Methode in Ihrem Modell 'Delete' !! Dadurch wird die Delete () -Methode von Doctrine_Record überschreiben, die Sie verrückt macht, um sie zu debuggen.

Andere Tipps

Ich persönlich mag es nicht, Doctrine :: Gettable ("table_name") zu verwenden, da er den Code nicht sehr trocken macht. Wenn sich "table_name" aus irgendeinem Grund jemals ändert, müssen Sie es an einer Vielzahl von Orten ändern.

Ich habe Doktrin in Zend Framework -Apps verwendet, daher beinhaltet mein typisches Gebrauchsmuster die Instanziierung einer geschützten Instanz jedes Modells in meinem Modul.

Mit diesem Muster würde ich dies einfach in meinem Controller tun

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

Wenn Sie Ihre Funktionen wirklich ähnlich halten möchten, würde ich so etwas verwenden

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

Antwort steht in Ihrer Frage: $ item ist kein Objekt (ich denke, der Wert ist falsch, aber Sie können var_dump ($ item) verwenden), da es in DB keine Zeile mit einer solchen ID gibt (auch ich denke, Ihre $ id ist null)

WARNUNG: get_class () erwartet, dass Parameter 1 Objekt ist, boolean in ...

Tödlicher Fehler: Rufen Sie eine Mitgliedsfunktion getNode () auf einem Nicht-Objekt auf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top