Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

karl-el

cake sem redundância de código

Recommended Posts

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.