Académique Documents
Professionnel Documents
Culture Documents
O padrão MVC foi desenvolvido para aplicações desktop, posteriormente, foi adaptado
para aplicações web. Atualmente, existem vários frameworks que utilizam esse padrão
para dividir o código em camadas. A forma de dividir as camadas pode variar de acordo
com implementação de cada framework. O MVC não é um padrão exclusivo da
Linguagem PHP, pelo contrário, ele está presente em praticamente todas as linguagens
de programação.
Outro ponto importante é entender como funciona o seu fluxo de interações. O ciclo
de interações inicia-se por meio de uma requisição feita pelo usuário, por exemplo, o
usuário clica em um botão que faz uma chamada no servidor, o controlador recebe
uma solicitação contendo informações enviadas pela camada visão; se for necessário,
o controlador solicita uma ação para a camada modelo e, em seguida, retorna o
resultado do processamento para a visão, permitindo ao usuário visualizar o resultado
de sua requisição. O modelo e o controlador não precisam conhecer a implementação
de código que está na visão, mas a visão precisa conhecer os dois.
Analisando o fluxo de interação do padrão MVC, chegamos a uma conclusão: se a
camada de controle (controller) e de modelo (model) não precisam conhecer a camada
de visão (view), então é porque elas não são dependentes da camada de visão, ou seja,
se futuramente for preciso reformular o layout do sistema ou até mesmo modificá-lo,
isso poderá ser feito sem alterar os códigos implementados nas camadas de modelo e
de controle; assim, a lógica de negócio e o controle das informações permanecerão
intactos.
Frameworks
De acordo com Wikipédia (2015), o framework é um conjunto de códigos pré-
programados com o intuito de prover uma funcionalidade genérica entre vários
projetos de softwares.
Geralmente, os frameworks permitem um alto grau de customização, de maneira que
possam atender às especificidades de cada aplicação. Um framework não pode ser
caracterizado como uma biblioteca adicional, porque, diferentemente das bibliotecas,
ele controla o fluxo de controle da aplicação, chamado de Inversão de Controle.
Em outras palavras, um framework é uma estrutura de pastas e arquivos, geralmente
no padrão MVC, contendo várias rotinas de códigos pré-programados. Ao invés de
você criar a estrutura de códigos do seu projeto, você escolhe o framework de sua
preferência, faz o download e inicia o seu projeto dentro da estrutura do framework.
A vantagem de fazer isso é que a maioria dos frameworks foram criados por grupos de
grandes desenvolvedores; por isso, as camadas de modelos e controladores possuem
inúmeros recursos para facilitar o desenvolvimento, além de fornecer todo o suporte
necessário no quesito de segurança, pois a maioria dos frameworks aplicam
tratamentos de segurança por padrão, como, por exemplo, a prevenção de ataques
contra SQL Injection.
Os problemas mais comuns de segurança, tratamento de erros, controle de sessão de
usuários, enfim, essa parte comum entre todos os sistemas já estão implementadas
dentro do framework; você só precisa chamar os métodos necessários para eles
funcionarem.
Para a Linguagem PHP, existem vários frameworks conceituados no mercado, entre
eles estão o Laravel, Symfony2, CakePHP, Zend e CodeIgniter. Segundo dados do
SitePoint (2016), o Laravel é o framework PHP mais popular no mundo. Seu diferencial
tem sido a facilidade de uso e a excelente documentação disponível para os
desenvolvedores.
Na hora de escolher um framework para o seu projeto, um fator decisivo deve ser a
sua documentação, pois isso fará muita diferença no decorrer do desenvolvimento do
projeto; um framework muda o estilo de programação do projeto e o torna totalmente
dependente.
Escolher um framework sem documentação é o mesmo que você adquirir um carro
sem saber dirigir e ainda não ter um instrutor para ensiná-lo.
Implementando MVC em PHP
Agora que você já sabe o que é o padrão MVC e um framework, criaremos um projeto
e implementaremos uma estrutura semelhante a um framework que utiliza esse
padrão. É claro que, ao invés de criar nossa própria estrutura, poderíamos utilizar um
framework existente, já que essa seria a escolha mais sensata. Mas não faremos isso
por dois motivos:
• Primeiro: seria necessária uma obra inteira para conceituar toda a complexidade de
um framework.
• Segundo: esse modelo que criaremos ilustrará de forma sucinta como um framework
trabalha, e é imprescindível entendermos isso antes de utilizar qualquer framework.
Bom, vamos iniciar a criação do nosso projeto. Para isso, realize os passos a seguir:
• Crie uma pasta chamada locadora dentro pasta htdocs do XAMP, localizada em: C:\
xampp\htdocs\.
• Dentro da pasta locadora, crie uma estrutura de pastas e arquivos de acordo com a
ilustração a seguir:
│ .htaccess
│ config.php
│ index.php
│
|-─Classes
│ Controller.php
© Projeto de Software com Banco de Dados 71
UNIDADE 3 – Implemen tação do Pad rão MVC
│ Model.php
│
|-─Controllers
│ HomeController.php
│ ClientesController.php
│
|-─Models
│ ClienteModel.php
│
|-─Views
│ |-─home
│ │ index.php
││
│ |-─clientes
│ │ index.php
│ │ formulario.php
││
│ |-─erros
│ │ 404.php
││
│ |-─layout
│ │ |-─css
│ │ |-─js
│ │ └─images
││
│ └─includes
│ cabecalho.inc.php
│ rodape.inc.php
│
└──────────────
Olhando para essa estrutura, você deve estar se perguntando se realmente precisa de
tudo isso. E a resposta é sim. Conforme citado anteriormente, essa estrutura é um
“resumo” da estrutura de um framework. Embora não pareça, faremos uma
implementação simples; toda essa estrutura é para reduzir códigos no
desenvolvimento do sistema.
Não se preocupe, no final desta unidade, será disponibilizado um link no qual você
poderá fazer o download dessa estrutura montada, mas, antes disso, você precisa
tentar montá-la para entender como funciona.
Ao criar a estrutura, você deverá tomar muito cuidado na hora de nomear os arquivos,
todos os nomes devem seguir rigorosamente o padrão estabelecido anteriormente,
inclusive as letras maiúsculas e minúsculas. As pastas Classes, Models, Controllers e
Views devem ser nomeadas no plural e com a primeira letra maiúscula.
Para entendê-la melhor, a seguir, veremos a documentação dessa divisão de pastas e
arquivos e suas respectivas implementações.
Como você pôde ver, a implementação de códigos mais complexa da nossa estrutura
está no arquivo index.php, porque esse arquivo receberá todas as requisições do
sistema e repassará para os arquivos responsáveis por processar e responder as
requisições. Por exemplo, isso acontecerá quando você requisitar as seguintes URLs
através do seu navegador de internet: <http://localhost/locadora/clientes> ou
<http://localhost/locadora/clientes/index>.
No arquivo index.php será executado o seguinte código:
Início Código 13––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
// Instancia o controlador ClientesController
$controlador = new ClientesController();
// Executa o método index()
$controlador->index();
Fim Código 13–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Ou seja, o arquivo index.php está programado para entender a URL da seguinte forma:
<http://localhost/locadora/[CONTROLADOR]/[ACAO]>.
Se, por ventura, você chamar um controlador ou uma ação que não existe, o arquivo
Views/erros/404.php será chamado e o usuário visualizará a mensagem de página não
encontrada.
A grande vantagem dessa estrutura é a mesma do framework. Você não precisa
entender toda a implementação feita nos arquivos index.php, Classes/Model.php e
Classes/Controller.
php, você só precisa saber quais métodos são fornecidos por eles e como você tem de
chamá-los.
Como fazer o download da estrutura do projeto
Você poderá fazer o download desse projeto completo por meio do seguinte link:
<https://github.com/eduardoazevedo3/projeto-de-software-php>. A maior parte dos
códigos está comentada; dessa forma, você poderá compreender melhor o
funcionamento de cada recurso.
A implementação
Utilizando o modelo desenvolvido na unidade anterior, nesta unidade,
desenvolveremos as páginas: Cadastro de Clientes, Filmes e Categorias de Filmes e
deixaremos a estrutura pronta para implementar a página de Locações de Filmes.
Esse modelo de projeto foi criado para atender às necessidades básicas de um sistema
por meio de uma implementação genérica nas camadas de modelo de dados e
controlador. Graças à estrutura que adotamos, você poderá realizar novas
implementações nativas, como módulo de cache, autenticação, controle de sessão,
logs de erros, ORM etc.
Modelos
Os modelos do nosso projeto estão estendendo as funcionalidades do arquivo Classes/
Model.php. Nesse arquivo, implementamos a conexão com o banco de dados por
meio do driver MySQLi do PHP. Essa implementação foi feita de maneira otimizada, na
qual o algoritmo de conexão detecta se já existe alguma conexão em aberto, se existir,
ele utiliza a conexão existente, se não, ele cria uma nova conexão com o MySQL.
Esse tipo de implementação é muito importante, pois conectar e desconectar a cada
comando SQL pode tornar a aplicação lenta, além de consumir mais recursos de
hardware do servidor.
Na unidade anterior, criamos a estrutura de arquivos, classes e métodos dos modelos;
nesta unidade, implementaremos os métodos para executar comandos SQL no banco
de dados, assim será possível filtrar, inserir, alterar e excluir dados no banco de dados
por meio das nossas classes de modelos.
<?php
/**
* Modelo de dados de Clientes
*/
namespace Models;
use Classes\Model;
class ClienteModel extends Model {
/*
* Buscar cliente pelo ID
*/
public function filtrar_por_id( $id ) {
// Prepare SQL para receber parametros
$stmt = $this->db->prepare(
‘SELECT * FROM clientes
WHERE id = ?’
);
// Proteger contra SQL Injection
$stmt->bind_param( ‘i’, $id );
// Executar comando SQL e retorna resultado
$stmt->execute();
// Returnar um registro, se encontrar
return $stmt->get_result()->fetch_object();
}
/*
* Buscar todas as clientes
*/
public function filtrar_todos() {
// Prepare SQL para receber parametros
$stmt = $this->db->prepare(
‘SELECT * FROM clientes’
);
// Executar comando SQL e retorna resultado
$stmt->execute();
// Returna resultado
return $stmt->get_result();
}
/*
* Salvar registro
* detecta se deve executar um INSERT ou UPDATE
*/
public function salvar( $cliente ) {
if ( $cliente->id == NULL || empty( $cliente->id ) ) {
$this->inserir( $cliente );
} else {
$this->alterar( $cliente );
}
}
/*
* Inserir novo registro via INSERT INTO...
*/
public function inserir( $cliente ) {
// Prepare SQL para receber parametros
$stmt = $this->db->prepare(
‘INSERT INTO clientes (cpf, nome, cep, endereco, numero,
bairro, cidade, uf, telefone, email)
VALUES (?,?,?,?,?,?,?,?,?,?)’
);
// Proteger contra SQL Injection
$stmt->bind_param( ‘ssssssssss’,
$cliente->cpf,
$cliente->nome,
$cliente->cep,
$cliente->endereco,
$cliente->numero,
$cliente->bairro,
$cliente->cidade,
$cliente->uf,
$cliente->telefone,
$cliente->email
);
// Executar comando SQL
return $stmt->execute();
}
/*
* Alterar registro via UPDATE
*/
public function alterar( $cliente ) {
// Prepare SQL para receber parametros
$stmt = $this->db->prepare(
‘UPDATE clientes
SET cpf = ?,
nome = ?,
cep = ?,
endereco = ?,
numero = ?,
bairro = ?,
cidade = ?,
uf = ?,
telefone = ?,
email = ?
WHERE id = ?’
);
// Proteger contra SQL Injection
$stmt->bind_param( ‘ssssssssssi’,
$cliente->cpf,
$cliente->nome,
$cliente->cep,
$cliente->endereco,
$cliente->numero,
$cliente->bairro,
$cliente->cidade,
$cliente->uf,
$cliente->telefone,
$cliente->email,
$cliente->id
);
// Executar comando SQL
return $stmt->execute();
}
/*
* Excluir registro
*/
public function excluir( $id ) {
// Prepare SQL para receber parametros
$stmt = $this->db->prepare(
‘DELETE FROM clientes
WHERE id = ?’
);
// Proteger contra SQL Injection
$stmt->bind_param( ‘i’, $id );
// Executar comando SQL
return $stmt->execute();
}
}
Como você pôde ver, as implementações dos modelos são praticamente iguais, a
diferença está no nome das tabelas e das colunas nos comandos SQL, e também nos
parâmetros enviados para a função prepare() do driver MySQLi.
Outro detalhe importante, são os tipos de dados retornados pelos métodos que
realizam consultas no banco de dados. O método filtrar_todos() está retornando um
objeto do mysqli_result, sendo assim, será necessário compreender o funcionamento
do driver do mysqli para percorrer os dados retornados e colocá-los em tela para o
usuário por meio da camada de visão.
// URL /clientes/form
public function form() {
// Incluir o layout da ação
require_once ABSPATH . ‘Views/clientes/form.php’;
}
// URL /clientes
public function index() {
// Buscar todos os clientes da tabela de clientes
$clientes = $this->cliente_model->filtrar_todos();
// Incluir o layout da ação
require_once ABSPATH . ‘Views/clientes/index.php’;
}
</div>
<div class=”form-group”>
<label for=”cliente-nome” class=”col-sm-2 control-label”>Nome:</
label>
<div class=”col-sm-10”>
<input type=”text” class=”form-control” name=”nome”
id=”cliente-nome” value=”<?php echo $cliente->nome ?>”>
</div>
</div>
<div class=”form-actions”>
<button class=”btn btn-primary”><span class=”glyphicon glyphiconplus”
aria-hidden=”true”></span> Salvar</button>
<a href=”<?php echo HOME_URL . ‘clientes’ ?>” class=”btn btndefault”><
span class=”glyphicon glyphicon-repeat” aria-hidden=”true”></span>
Voltar</a>
</div>
</form>
<?php require_once ABSPATH . ‘Views/includes/rodape.inc.php’; ?>
Perceba que, no início dos controladores, foram adicionadas as classes que estão
sendo usadas pelo controlador. Por exemplo, no caso do controlador de filmes, foi
necessário importar o FilmeModel e CategoriaModel, isso porque, no formulário
Cadastro de Filmes, é necessário carregar dados do filme e as categorias disponíveis,
possibilitando, assim, a relação entre o filme e a categoria de filme (comédia, ação,
suspense, policial etc.). No caso do controlador de filmes, no início do arquivo, estão as
seguintes linhas:
<?php
/**
* Controlador Filmes
*/
namespace Controllers;
use Classes\Controller; // Usar classe dentro de Controller.php
use Models\FilmeModel; // Usar classe dentro de FilmeModel.php
use Models\CategoriaModel; // Usar classe dentro de CategoriaModel.php
...
2.4. visão
A camada de visão é responsável por tratar toda a parte de layout do sistema. A
vantagem de utilizar o padrão MVC é que essa camada precisa conhecer as camadas
de controle e de modelo. Quanto esses últimos, não precisam conhecer a camada de
visão; dessa forma, você poderá mudar o layout do sistema sempre que precisar sem
alterar a lógica de negócio ou também criar vários temas (padrão cores e fontes)
diferentes.
No tópico anterior, foi ilustrado o modo de como as informações são enviadas do
controle para a visão, como você pôde ver, as variáveis declaradas no controlador
podem ser acessadas na visão desde que estejam dentro do mesmo método. Por
exemplo, tenho a variável $clientes = $this->cliente_model->filtrar_todos() no
controlador de clientes que, no caso, está recebendo todos os clientes cadastrados.
Veja, a seguir, como os dados dessa variável seriam descarregados dentro de uma
tabela HTML:
<table class=”table table-striped table-hover”>
<thead>
<tr>
<th>#</th>
<th>Nome</th>
<th>CPF</th>
<th>E-mail</th>
</tr>
</thead>
<tbody>
<?php while ( $cliente = $clientes->fetch_object() ) : ?>
<tr>
<td><?php echo $cliente->id ?></td>
<td><?php echo $cliente->nome ?></td>
<td><?php echo $cliente->cpf ?></td>
<td><?php echo $cliente->email ?></td>
</tr>
<?php endwhile; ?>
</tbody>
</table>
Conforme estudamos na primeira unidade, para percorrer um vetor, é necessário
utilizar uma estrutura de repetição, como: while, for, foreach ou do-while. Nesse caso,
utilizamos o while porque a variável $clientes é o resultado de uma consulta em SQL,
especificamente, um objeto da classe MySQLi_Result.
Agora que temos um exemplo de como enviar os dados do controlador para a visão,
para finalizar nosso projeto de software, implementaremos todos os arquivos da
camada de visão.
Como você pôde ver, todas as páginas referentes aos cadastros de clientes, filmes e
categorias de filmes estão incluindo o cabeçalho no início e o rodapé no final da
implementação.
Fazendo isso, você pode criar o cabeçalho e o rodapé em um arquivo separado e
importá-los em todas as páginas que precisar no sistema. A vantagem é que, se
precisar mudar alguma coisa no arquivo do cabeçalho, a mudança será feita em todas
as páginas que estiverem incluindo o arquivo.
Como fazer o download do projeto
Faça o download desse projeto completo por meio do seguinte link: <https://github.
com/eduardoazevedo3/projeto-de-software-php>. Você verá que a maior parte dos
códigos estão comentados, dessa forma, você poderá compreender melhor o
funcionamento de cada recurso.
Antes de testar o projeto no seu computador, não se esqueça de criar o banco de
dados e inserir os dados de conexão no arquivo config.php localizado na raiz do
projeto.
REFERÊNCIAS BIBLIOGRÁFICAS
COSTA, Ramon Gomes; TODESCHINI, Leonardo. Web: como programar usando ferramentas livres: HTML, JavaScript,
Apache,
MySQL e PHP. Rio de Janeiro: Alta Books, 2006.
MUTO, Cláudio Adonai. PHP & MySQL: guia completo. 2. ed. Rio de Janeiro: Brasport, 2004.
OLIVIERA, Carlos A. J. Faça um site: PHP 5.2 com MySQL 5.0: comércio eletrônico: orientado por projeto. São Paulo:
Érica,
2010. 412 p.
DALL’OGLIO, Pablo. PHP Programando com orientação a Objetos. São Paulo: Novatec Editora, 2009.