Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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]](http://www.seusite.com.br/login.php%5B/url%5D) 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.
Carregando comentários...