karl-el 0 Denunciar post Postado Junho 11, 2010 Quando fazemos nosso controlador fazemos chamadas diretas ao métodos da classe model, por exemplo, $this->Exemplo->save($this->data);Ocorre que se tivermos 5 tabelas sobre as quais são realizadas operações como salvar, editar, deletar, selecionar e listar faremos $this->Exemplo->create(); $this->Exemplo->save($this->data) 5 vezes para salvar os dados: uma em cada controlador.Isso é uma redundância desnecessária de código primeiro porque isso não aproveita a orientação a objeto, segundo porque dificulta a manutenção. A solução é usar a classe AppModel a qual todo modelo extende. class AppModel extends Model { protected function idInvalido(){ if(!$this->id || !is_numeric($this->id)) return TRUE; else return FALSE; } function salvar(){ $this->create($this->data); return $this->saveAll($this->data); } function editar(){ if($this->idInvalido()) return FALSE; return $this->saveAll($this->data); } function deletar(){ if($this->idInvalido()) return FALSE; return $this->deleteAll(array("conditions"=>array("Usuario.id = "=>$this->id),TRUE)); } function selecionar(){ if($this->idInvalido()) return FALSE; else return $this->read(NULL,$this->id); } function listar(){ return $this->find("all"); } } ?> <?php class Usuario extends AppModel{ var $name = "Usuario"; function salvarUsuario(){ return $this->salvar(); } function editarUsuario(){ return $this->editar(); } function deletarUsuario(){ return $this->deletar(); } function selecionarUsuario(){ return $this->selecionar(); } function listarUsuarios(){ return $this->listar(); } } ?> <?php class UsuariosController extends AppController{ var $name = "Usuarios"; private $haDados = FALSE; function beforeFilter(){ if(!empty($this->data)){ $this->Usuario->data = $this->data; $this->haDados = TRUE; } return $this->haDados; } function index(){ $this->set("dados",$this->Usuario->listarUsuarios()); } function salvar(){ if($this->haDados) if($this->Usuario->salvarUsuario()) $this->redirect(array("action"=>"index")); else $this->Session->setFlash(__("Ocorreu um erro",TRUE)); } function selecionar($id = FALSE){ $result = $this->Usuario->selecionarUsuario(); if($result) $this->data = $result; else $this->Session->setFlash(__("Nenhum dados foi encontrado",TRUE)); } function editar($id = FALSE){ if($this->haDados) if($this->Usuario->editarUsuario()) $this->redirect(array("action"=>"index")); else $this->Session->setFlash(__("Ocorreu um erro",TRUE)); else $this->selecionar($id); } } ?> Concentrar no model os métodos que acessam o banco ao invés de fazer chamadas diretas nos controladores deixa os controladores mais enxutos e é muito melhor testar no model do que no controller (estou falando dos testes unitários usando a simpleTest com o cake).Se for necessário um método, por exemplo, salvar mais específico basta sobrescrever o método salvar() da classe AppModel. Compartilhar este post Link para o post Compartilhar em outros sites
karl-el 0 Denunciar post Postado Junho 11, 2010 apenas para corrigir um erro indentação. function salvar(){ if($this->haDados) if($this->Usuario->salvarUsuario()) $this->redirect(array("action"=>"index")); else $this->Session->setFlash(__("Ocorreu um erro",TRUE)); } Compartilhar este post Link para o post Compartilhar em outros sites
lucaswxp 22 Denunciar post Postado Junho 11, 2010 Vou mover para a área de tutoriais. ---------------- Muito boa sua contribuição, eu estava pensando em postar algo do tipo, mas agora parece não ser mais necessario =) Compartilhar este post Link para o post Compartilhar em outros sites