2

Doctrine ネストセット機能を使用しているモデルがいくつかあります。アプリケーションで必要なため、ツリーから要素の削除機能を追加したいと考えています。ドキュメントのスニペットを試していましたが、そのコードで非常に奇妙なエラーが発生しています。

YAML はこちら: http://pastie.org/820978

そして、私はMenuクラスの魔女が生成された抽象クラス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 がオブジェクトであると想定しており、ブール値は次で指定されます...

ただし、これに対する解決策が必要であり、すべてのヒントを歓迎します...

4

3 に答える 3

0

getNode()は、Doctrine_RecordではなくDoctrine_Nodeを返します。

Doctrine_Recordは削除できますが、Doctrine_Nodeは削除できません-とにかく永続的ではないためです。

正しいロジックは次のとおりです。

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

また、モデル内のメソッドに「削除」という名前を付けないでください。これにより、Doctrine_Recordのdelete()メソッドがオーバーライドされ、デバッグに夢中になります。

于 2010-02-27T00:52:49.997 に答える
0

個人的には Doctrine::getTable("table_name") を使うのは好きではありません。何らかの理由で「table_name」が変更された場合、多くの場所で変更する必要があります。

私は Zend Framework アプリで Doctrine を使用したので、私の典型的な使用パターンには、モジュール内のすべてのモデルの保護されたインスタンスをインスタンス化することが含まれます。

そのパターンを使用して、コントローラーでこれを行うだけです

$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();
 }
于 2010-02-12T00:13:46.777 に答える
0

答えはあなたの質問にあります: $item はオブジェクトではありません (値は false だと思いますが、var_dump($item) を使用できます)。これは、DB にそのような ID を持つ行がないためです (また、$id が null だと思います)。

警告: get_class() は、パラメーター 1 がオブジェクトであると想定しており、ブール値は次で指定されます...

致命的なエラー: 非オブジェクトでのメンバー関数 getNode() の呼び出し

于 2010-02-12T20:28:37.127 に答える