Ir para conteúdo

POWERED BY:

Arquivado

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

Daniel_Ribeiro

Programando em MVC com PHP

Recommended Posts

Ok, vamos por partes.. rsrss.. Para se ter uma ideia, vamos partir para o modelo de programacao orientada a objetos.

Pois programar em MVC nada mais eh do que programar tambem usando orientacao a objetos.

 

Vamos pensar entao no conceito de objeto. A exemplo, um veiculo, onde teremos a classe de veiculo e seus metodos

 

class Veiculo {	/**	 * Contrutor da classe	 *	 */	public function __contruct(){	}	/* 	qualquer veiculo tem os seus metodos padroes de	*/	public function andar(){		//.... codigo aqui	}	public function parar(){		//.... codigo aqui	}}

Agora digamos que temos varios veiculos, temos carro, moto, bicicleta e cada um tera eventos

diferentes um do outro. para isso criamos novas classes extendendo a classe veiculo

no qual as novas classes irao herdar os metodos e propriedades da classe veiculo

 

class Bicicleta extends Veiculo {	// A bicicleta por sua vez contem propriedades	public $rodas;	// E tbm tem um metodo construtor	public function __construct(){		$this->rodas = 2;	}	// E tbm seus metodos	public function trocarMarcha(){		//.... codigo aqui	}}

Desta forma quando instanciamos o objeto bicicleta, podemos utilizar os metodos de veiculo, pois bicicleta

eh uma extensao de veiculo ex:

 

$meuVeiculo = new Bicicleta();$meuVeiculo->trocarMarcha();$meuVeiculo->andar();$meuVeiculo->parar();

Agora vamos construir outra classe (Automovel) que instancia veiculo

 

class Automovel extends Veiculo {	// Contrutor	public function __construct(){	}	public function ligar(){		//.... codigo aqui	}	public function desligar(){		//.... codigo aqui	}}

Desta forma quando instanciamos o objeto Automovel, podemos utilizar os metodos de veiculo, pois automovel

eh uma extensao de veiculo ex:

 

$meuVeiculo = new Automovel();$meuVeiculo->ligar();$meuVeiculo->andar();$meuVeiculo->parar();$meuVeiculo->desligar();

Percebeu que desta forma, se eu quiser mudar o comportamente de um Veiculo (independente do que ele seja) basta

modificar a classe Veiculo, que todos os tipos de veiculos serao alterados (pois eles estendem a classe veiculo)

Isso facilita mto na manutencao de codigo...

Pois bem, onde queremos chegar com tudo isso? Uma aplicacao MVC nada mais eh do que classes principais de

 

M - Model - Utilizada como o negocio da sua aplicacao, tudo o que for utilizado para armazenamento de dados ou obtencao dos dados da aplicacao)

V - View - Utilizada para exibir para o usuario tudo o que a aplicacao produz

C - Controller - Utilizada para realizar o controle integrando o Model e View (� aqui e controlamos o fluxo da aplicacao)

 

Bem se sabemos que o Model Interage com o banco de dados, entao criamos uma classe model principal com os metodos

principais que ele tem

 

PS: O exemplo que estou colocando aqui eh so mero exemplo, pra você ter uma ideia, eh claro que uma classe model existem

mais metodos, dependendo da sua aplicacao

 

class Model {	public function __construct(){	}	public function conectar(){		// codigo pra conectar ao banco de dados	}	public function query(){		// codigo pra executar uma query	}	public function desconectar(){		// codigo pra desconectar do banco	}}

Bem agora temos a classe View

 

class View {	public function __construct(){	}	public function mostrarNaTela( $template ){		// mostra na tela usando o template escolhido, aqui vem o codigo pra ele dar include em algum arquivo html		// modificando os valores que ja estao atribuidos a View e etc...	}	public function atribuirValor( $var, $valor ){		// codigo pra atribuir valores na view	}}

 

Se você perceber, o smarty segue um criterio semelhante, nao sei se você ja usou smarty, mas ele funciona mais ou menso assim

 


$smarty->assign('var2', $var1);

$smarty->display('template.tpl'); // em nossa View o metodo mostrarNaTela() _linenums:0'>$smarty = new Smarty();$smarty->assign('var1', $var1); // em nossa View o metodo atribuirValor()$smarty->assign('var2', $var1);$smarty->display('template.tpl'); // em nossa View o metodo mostrarNaTela()

Bom, ja que temos metodos semelhantes, podemos entao, aplicar em nossa view, todos os metodos do smarty,

pra nao ter que se preocupar em trabalhar com manipulacao de templates...

entao ficaria mais ou menos assim a nossa view

 

class View {	private $smarty; // declaro a propriedae Smarty aqui dentro da nossa view (veja que eh uma propriedade private, pois somente a classe View pode acessar ela	public function __construct(){		// quando entao for chamado o contrutor da classe, ele instancia o objeto Smarty		$this->smarty = new Smarty();	}	public function mostrarNaTela( $template ){		$this->smarty->display( $template ); // chama o metodo do smarty pra exibir o template na tela	}	public function atribuirValor( $var, $valor ){		$this->smarty->assign( $var, $valor ); // chama o metodo do smarty para atribuir o valor a variavel	}}

Bom, ate você deve estar se perguntando... pow.. entao se eu vou usar o smarty, pq entao eu tenho que criar uma View

e usar os metodos do smarty dentro da view? nao poderia usar diretamente o smarty?

Poderia, mas digamos que você posteriormente nao queira mais utilizar o smarty, e sim outro gerenciador de templates..

você teria que mecher em sua aplicacao inteira... nao eh? Fazendo uma view, você so meche na classe view, e programa

a classe view pra usar outro gerenciador de templates e etc.. Pode tbm fazer verificacoes antes de chamar qualquer metodo,

algo do tipo.. Antes de atribuirValor, quero que o sistema faca uma verificacao do valor pra ver se nao contem certar

palavras e substituir antes de atribuir e etc.. Ou entao, a sua classe View pode verificar de onde o usuario esta vindo

e exibir o template mais correto pra ele.. as possibilidades nao infinitas, tudo depndendo de modificar somente 1 classe

e sua aplicacao inteira sera modificada.

 

Bem, passemos entrar para a classe controller

esta classe contem os metodos basicos que farao a sua aplicacao funcionar...

ate mesmo metodos genericos que você utiliza dentro da sua aplicacao.

 

class Controller {	public function __construct(){	}	public function redirect( $url ){		header('Location: ' . $url);	}	public function error( $error ){		// se algum erro acontecer, chamo esse metodo, q vai fazer alguma coisa (mandar um email, gravar log.. )		$this->log( $error );	}	public function log( $mensagem ){		// grava uma menagem de log em algum arquivo qualquer definido aqui	}}

Resumindo, a classe Controller ira utilizar metodos que sao genericos para todos os modulos de sua aplicacao..

Bem, agora que ja temos o Model, View e Controller, vamos criar os modulos de nossa aplicacao usando MVC.

 

Um dos modulos eh o modulo de login, entao teremos o loginModel, loginView, loginController e cada um desses

serao classes que extenderao suas respectivas "classes maes" exemplo

 

class loginModel extends Model {	public function __construct(){	}	/**	 * Um metodo para verficiar a senha do usuario	 *	 * @param string $usuario	 * @param string $senha	 * @return bool	 */	public function verificarSenhaUsuario($usuario, $senha){		$this->conectar();		$resultado = $this->query("SELECT * FROM usuarios WHERE usuario = $usuario AND senha = $senha");		$this->desconectar();		return $resultado;	}}

 

A classe de View do login, alem de ter os metodos herdados do View principal, tbm seus proprios metodos

 


}

 

/**

* Exibe a tela de erro

*

*/

public function exibirTelaErro(){

$this->mostrarNaTela('erro.tpl');

}

 

public function exibirTelaLogado(){

$this->mostrarNaTela('logado.tpl');

}

 

} _linenums:0'>class loginView extends View { public function __construct(){ } /** * Exibe a tela de login * */ public function exibirTelaLogin(){ $this->mostrarNaTela('login.tpl'); } /** * Exibe a tela de erro * */ public function exibirTelaErro(){ $this->mostrarNaTela('erro.tpl'); } public function exibirTelaLogado(){ $this->mostrarNaTela('logado.tpl'); }}

Agora sim iremos para a classe do controlador, que ira interagir com loginModel e loginView

 


$this->gravaSessao();

$this->log('usuario logou');

$this->view->exibirTelaLogado();

}

else{

$this->log('usuario tentou logar mas nao conseguiu');

$this->view->exibirTelaErro();

}

}

 

/**

* Esses metodos eh private, significando que so podem ser chamando dentro da classe

*

*/

private function gravaSessao(){

// grava a sessao usando session ou cookie

}

 

/**

* Esses metodos eh private, significando que so podem ser chamando dentro da classe

*

*/

private function apagaSessao(){

// limpa a sessao ou cookie

}

 

} _linenums:0'>class loginController extends Controller { // o loginController vai agregar loginModel e loginView entao criamos esses objetos aqui /** * @var loginModel */ private $model; /** * @var loginView */ private $view; public function __construct(){ // instanciamos os objetos $this->model = new loginModel(); $this->view = new loginView(); } public function telaLogin(){ // o metodo contrutor ja chama a view do login pra exibir a tela de login $this->view->exibirTelaLogin(); } public function fazerLogin(){ // tenta ver se o usuario colocou a senha certa if( $this->model->verificarSenhaUsuario( $_POST['usuario'], $_POST['senha'] )){ $this->gravaSessao(); $this->log('usuario logou'); $this->view->exibirTelaLogado(); } else{ $this->log('usuario tentou logar mas nao conseguiu'); $this->view->exibirTelaErro(); } } /** * Esses metodos eh private, significando que so podem ser chamando dentro da classe * */ private function gravaSessao(){ // grava a sessao usando session ou cookie } /** * Esses metodos eh private, significando que so podem ser chamando dentro da classe * */ private function apagaSessao(){ // limpa a sessao ou cookie }}

Bem agora que ja temos o nosso controlador loginController, temos que fazer com que ele seja instanciado e chamado

pelo usuario, para isso teremos um arquivo de login onde ira fazer a instancia do nosso controlador do login

algo como login.php, este arquivo sera chamado pelo browser, onde fara a requisicao da sua classe

 

arquivo login.php

 

$objLogin = new loginController();/*verifica que metodo o browser esta chamando, se nao chamar nenhum metodo, exibo a tela de loginDesta forma se for chamado a url[url="http://www.seusite.com.br/login.php"]http://www.seusite.com.br/login.php[/url] ele vai chamar o metodo padrao telaLogin*/if( !$_REQUEST['action'] ){	$_REQUEST['action'] = 'telaLogin';}// agora eu executo o metodo passado via urleval('$objLogin->' . $_REQUEST['action']);

Bom, pensando dessa maneira, você tera que fazer um arquivo para cada modulo do seu sistema, se o seu sistema tiver

varios modulos, entao tera varios arquivos

 

login.php

usuarios.php (modulo de controle de usuarios)

produtos.php (modulo de controle de produtos)

....

...

..

 

Se formos ver, todos os arquivos que fazem as requisicoes de suas classes sao semelhantes, entao pq nao generalizar

e fazer em um arquivo somente..? Tipo, um arquivo que pode ser usado para chamar qualquer modulo do ssisema?

 

main.php

 


 

// define uma acao default

if( !$_REQUEST['action'] ){

$_REQUEST['action'] = 'acaoPadrao'; // isso implica que todos os controllers terao que ter um metodo chamado acaoPadrao

}

 

// agora eu executo o metodo passado via url

eval('$instancia' . $_REQUEST['action']); _linenums:0'>// instancia o moduloeval('$instancia = new ' . $_REQUEST['modulo'] . 'Controller();');// define uma acao defaultif( !$_REQUEST['action'] ){ $_REQUEST['action'] = 'acaoPadrao'; // isso implica que todos os controllers terao que ter um metodo chamado acaoPadrao}// agora eu executo o metodo passado via urleval('$instancia' . $_REQUEST['action']);

agora você tem um arquivo so que pode chamar qualquer modulo / metodo do seu sistema.. bastando especificar na url

 

http://www.seusite.com.br/main.php?module=login

http://www.seusite.com.br/main.php?module=usuario

http://www.seusite.com.br/main.php?module=produtos

 

 

Bem, o que eu escrevi aqui eh mais para fim didatico de como construir aplicacoes usando o modelo MVC, eh claro que depois

de voce pegar o conceito, você vai aperfeicoar melhor a sua maneira de programar e vera como criando aplicacoes

dessa maneira, sera mais produtivo ao criar novos modulos para suas aplicacoes bem como tambem dar manutencao a eles.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uooowwww, muito bom, e muito bem explicado ^^mereçe uma atenção especial =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola a todos.

Adorei mesmo este material, estive implementando em meu servidor e esta causando um erro na ultima linha do main.php

// agora eu executo o metodo passado via urleval('$instancia' . $_REQUEST['action']);
veja a msg de erro:
Parse error: syntax error, unexpected $end in /home/regis/Regis/sites/despFamiliar/mvc/main.php(30) : eval()'d code on line 1

Alguem pode me ajudar? por favor

 

Obrigado.

Régis

Compartilhar este post


Link para o post
Compartilhar em outros sites

Blza.. fikou muito bem explicado.. esta de parabens... Muito bom mesmo.

Soh perguntei pq foi uma duvida q me bateu aki.. saka?

mas blza... tipo.. tbm o seguinte.. um exemplo..

 

Eu tenho uma tabela no banco com os usuarios do sistema, com nome, senha e mais alguns detalhes.

voce faria uma class Login e outra class para tratar as informacoes do usuarios (ex: cadastro, alteracao de dados...), ou faria uma class Usuarios, com todas esses methodos?

 

heheheh.. vlw hein.. brigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pense no modelo de quem irá acessar essa classe:

 

login (todo mundo pode acessar o modulo de login para poder se logar no sistema)

cadastro/alteracao (nem todo mundo poderá acessar essa classe)

 

Entao seria coerente separar essas acoes para posteriormente poder fazer um controle de acesso bem planejado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Er... arrumei um tempo pra estudar MVC, esta brincadeira levou fama mesmo por causa do Ruby on Rails no qual hoje tirei um dia pra aprender, e pude perceber que este MVC em PHP nao é tão prazeroso como em Rails, eu resolvi estudar Rails porque estou motando um framework MVC em PHP e vi que em PHP isto da um trabalho danado pra criar este monte de arquivo. Em rails é so dar um comando bobo que tudo acontece eu quero tirar o melhor de MVC em rails e aplicar no PHP como por exemplo uma coisa que eu nao concordo muito e este codigo aki:

 

// instancia o modulo

eval('$instancia = new ' . $_REQUEST['modulo'] . 'Controller();');

 

// agora eu executo o metodo passado via url

eval('$instancia' . $_REQUEST['action']);

 

 

Este negocio de usar eval nao rola viu.. tem que haver uma tecnica melhor.

 

Estou estudando. logo posto mais.

 

Falow..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui, criar fiz tudo o que manda e não deu certo. Ele não executa o arquivo. Queria saber se tem alguma configuração básica para o Smarty?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguem sabe me dizer de quem é o papel da ação de simplesmente abrir um XML e retornar-lo?

 

É funçao do controller ou do model?

 

Ta ai uma dúvida.

 

Eu achei que era do model, o XML é um RSS onde eu passo a URI para carregar o XML.

 

O que vcs me dizem?

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.