Doutrina Nestedset delete
-
20-09-2019 - |
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 ...
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