Pergunta

Eu tenho alguns modelos que as bruxas estão usando o recurso de detetividade de doutrina. Quero adicionar a funcionalia de exclusão de elementos da árvore, pois isso é necessário no meu aplicativo. Eu estava tentando com trechos da documentação, mas estou recebendo um erro muito estranho com esse código.

Yaml está aqui: http://pastie.org/820978

E estou tentando com este código na minha classe de menu que estende a classe abstrata de base e basemenu estende doutrine_record :)

De qualquer forma, meu código:

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

E eu recebo isso um erro:

Erro fatal: ligue para uma função de membro getNode () em um objeto não-objeto

E acabei de notar que get_class ($ item) está fazendo uma emergência (para que provavelmente seja motivo para esse comportamento estranho):

Aviso: get_class () espera que o parâmetro 1 seja objeto, booleano dado em ...

No entanto, preciso de uma solução para isso e todas as dicas são bem -vindas ...

Foi útil?

Solução

getNode () retorna uma doutrina_node, não uma doutrina_record.

Uma doutrina_record pode ser excluída, mas uma doutrina_node não pode ser excluída - porque não é persistente de qualquer maneira.

A lógica correta seria simplesmente:

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

Além disso, não cite um método no seu modelo 'delete' !! Isso substituirá o método Dechtrine_record de Delete (), que o deixará louco tentando depurar.

Outras dicas

Pessoalmente, não gosto de usar a doutrina :: getTable ("tabela_name") porque não torna o código muito seco. Se, por algum motivo, "tabela_name" mudar, você terá que alterá -lo em muitos lugares.

Usei a doutrina nos aplicativos da estrutura ZEND; portanto, meu padrão de uso típico envolve instanciar uma instância protegida de todos os modelos do meu módulo.

Usando esse padrão, eu faria isso no meu controlador

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

Se você realmente deseja manter suas funções semelhantes, eu usaria algo assim

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

A resposta está em sua pergunta: $ item não é objeto (acho que seu valor é falso, mas você pode usar o var_dump ($ item)), porque não há linha com esse id em db (também acho que seu $ id é nulo)

Aviso: get_class () espera que o parâmetro 1 seja objeto, booleano dado em ...

Erro fatal: ligue para uma função de membro getNode () em um objeto não-objeto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top