Tutorial do framework PHP MVC
โก Resumo Inteligente
O framework PHP MVC (Model-View-Controller) separa os dados da aplicaรงรฃo e a lรณgica de negรณcios da apresentaรงรฃo, utilizando Models (Modelos), Views (Visรตes) e Controllers (Controladores). CodeO Igniter torna esse padrรฃo prรกtico, permitindo que os desenvolvedores PHP criem aplicativos web seguros e de fรกcil manutenรงรฃo mais rapidamente.

O que รฉ estrutura PHP MVC?
PHP MVC รฉ um padrรฃo de design de aplicativo que separa os dados do aplicativo e a lรณgica de negรณcios (modelo) da apresentaรงรฃo (visualizaรงรฃo). MVC significa Modelo, Visualizaรงรฃo e Controlador.
O controlador faz a mediaรงรฃo entre os modelos e as visualizaรงรตes.
Pense no padrรฃo de design MVC como um carro e o motorista.
O carro possui para-brisas (visรฃo) que o motorista (controlador) utiliza para monitorar o trรกfego ร frente e, em seguida, acelerar ou frear (modelo) dependendo do que vรช ร frente.
Em seguida, vejamos por que vale a pena usar uma estrutura construรญda com base nesse padrรฃo.
Por que usar PHP MVC Framework?
Os frameworks PHP MVC simplificam o trabalho com tecnologias complexas ao:
- Escondendo todos os detalhes complexos de implementaรงรฃo
- Fornecer mรฉtodos padrรฃo que podemos usar para construir nossos aplicativos.
- Aumento da produtividade do desenvolvedor, pois implementaรงรตes bรกsicas de atividades como conexรฃo com o banco de dados e higienizaรงรฃo da entrada do usuรกrio jรก estรฃo parcialmente implementadas.
- Incentivar a adesรฃo aos padrรตes de codificaรงรฃo profissional.
Padrรฃo de design PHP MVC
Vamos agora discutir brevemente cada componente do padrรฃo de design MVC.
Modelo โ esta parte trata da lรณgica de negรณcios e dos dados da aplicaรงรฃo. Ele pode ser usado para realizar validaรงรตes de dados, processar dados e armazenรก-los. Os dados podem vir de;
- arquivo plano
- banco de dados
- documento XML
- Outras fontes de dados vรกlidas.
Responsรกvel pelo Tratamento โ Esta รฉ a parte que lida com as solicitaรงรตes de recursos do usuรกrio ao servidor.
Por exemplo, quando o usuรกrio solicita o URL โฆ/index.php?products=listO controlador carregarรก o modelo de produtos para recuperar os dados dos produtos e, em seguida, exibirรก os resultados na lista.
Resumindo, o controlador vincula os modelos e visualizaรงรตes dependendo dos recursos solicitados.
Visualizaรงรตes โ Esta parte trata da apresentaรงรฃo dos dados ao usuรกrio. Normalmente, isso รฉ feito por meio de pรกginas HTML.
Tipos de estrutura PHP MVC
Selecionar o melhor framework PHP รฉ um desafio.
Vocรช nรฃo precisa escrever sua prรณpria estrutura para se beneficiar das vantagens do MVC.
Vocรช sรณ deve tentar criar seu prรณprio design de aplicativo relacionado ao MVC para entender como as estruturas MVC funcionam.
Quando estiver confortรกvel com a forma como os frameworks MVC funcionam, vocรช deverรก passar para os frameworks maduros e jรก testados.
A tabela abaixo descreve brevemente alguns dos frameworks PHP mais populares e os recursos que cada um oferece.
| Quadro | Descriรงรฃo |
|---|---|
|
|
ร um dos frameworks PHP MVC mais populares, atualmente em sua quarta versรฃo principal (CodeIgniter 4). ร leve e tem uma curva de aprendizado curta. Possui um conjunto robusto de bibliotecas que ajudam a construir sites e aplicativos rapidamente. Usuรกrios com conhecimento limitado de programaรงรฃo orientada a objetos tambรฉm podem utilizรก-lo. Aplicativos construรญdos com CodeIgniter inclui;
|
|
ร um framework HMVC (Hierarchical Model View Controller) seguro e leve. Observaรงรฃo: O Kohana foi oficialmente descontinuado em 2017; sua รบltima versรฃo estรกvel foi a 3.3.6 (julho de 2016). O fork comunitรกrio Koseven continuou seu cรณdigo-fonte. Empresas que utilizaram o Kohana incluem: |
|
ร baseado no Ruby on Rails e permanece em manutenรงรฃo ativa (versรฃo 5.x). ร conhecido por conceitos como padrรตes de projeto de software, convenรงรฃo sobre configuraรงรฃo, ActiveRecord etc. CakePHP aplicaรงรตes alimentadas incluem; |
|
|
ร uma estrutura poderosa;
ร ideal para desenvolvedores.ping Aplicaรงรตes empresariais. Em 2020, o Zend Framework fez a transiรงรฃo para o projeto de cรณdigo aberto Laminas. As aplicaรงรตes baseadas em Zend/Laminas incluem:
Empresas que utilizaram o framework Zend incluem:
|
Framework PHP MVC vs PHP puro: principais diferenรงas
Na prรกtica, o que um framework realmente muda? O PHP puro oferece total liberdade, mas todo projeto acaba reinventando o roteamento, a validaรงรฃo e o acesso ao banco de dados do zero. Um framework PHP MVC padroniza essas tarefas repetitivas, mantendo a consistรชncia do cรณdigo entre projetos e equipes.
| Aspecto | PHP puro | Framework PHP MVC |
|---|---|---|
| Code organizaรงรฃo | HTML, SQL e lรณgica combinados em arquivos รบnicos | Separado em modelos, visualizaรงรตes e controladores. |
| Acesso ao banco de dados | Consultas escritas ร mรฃo em todas as pรกginas. | Construtor de consultas integrado ou ORM com vinculaรงรฃo de parรขmetros |
| Total | O desenvolvedor deve se lembrar de todas as medidas de seguranรงa. | Filtragem de entrada, proteรงรฃo contra XSS e CSRF incluรญdas. |
| Manutenรงรฃo | As alteraรงรตes se propagam de forma imprevisรญvel pelos arquivos. | Cada camada pode ser alterada independentemente. |
๐ก Dica: Comece criando um pequeno projeto PHP simples, como o da enquete abaixo; a dificuldade de lidar com cรณdigo misto torna รณbvio o valor da separaรงรฃo do MVC.
Adaptar o aplicativo de pesquisa de opiniรฃo para CodeIgnorar
Neste curso tutorialCriamos um aplicativo de pesquisa em PHP. Aqui, vamos portar esse cรณdigo para... CodeIgnorar
- Baixar a รบltima versรฃo de CodeIgnitor deles .
- ExtracExtraia o conteรบdo do arquivo compactado para o diretรณrio de desenvolvimento do seu servidor web. Usaremos "ciopinionpoll" como nome da pasta nesta liรงรฃo.
- Navegue atรฉ o URL http://localhost/ciopinionpoll/
O CodeA pรกgina de boas-vindas do Igniter acima confirma que o framework foi instalado corretamente. Agora vamos migrar nosso aplicativo de pesquisa de opiniรฃo para... CodeIgniter. Lembre-se de que nossa aplicaรงรฃo foi dividida em trรชs componentes principais, a saber:
- Controlador frontal โ esta รฉ a parte que responde a URL O controlador faz a requisiรงรฃo e retorna a pรกgina solicitada.
- Modelo โ este รฉ o cรณdigo que responde ร s solicitaรงรตes de dados e retorna os dados solicitados. Este cรณdigo serรก inserido no modelo.
- Visualizaรงรตes โ este รฉ o cรณdigo responsรกvel por formatar e exibir os dados. Este cรณdigo irรก para a visualizaรงรฃo
Definiรงรตes de configuraรงรฃo do banco de dados
Para configurar a conexรฃo com o banco de dados:
- Acesse a pasta ciopinionpoll
- Abra o banco de dados.php Arquivo localizado no diretรณrio application/config.
- Localize as seguintes linhas de cรณdigo
- Defina o nome de usuรกrio como root
- Defina a senha para a senha de root do seu localhost.
- Defina o nome do banco de dados como opinion_poll. Observe que usaremos o banco de dados criado na liรงรฃo anterior.
- Salve as alteraรงรตes e feche o arquivo.
Criando Nosso Modelo
Em seguida, vamos criar nosso modelo que estenderรก o CI_Model. O CI_Model faz parte do CodeBibliotecas Igniter. O modelo estarรก localizado em application/models. opiniรฃo_poll_model.php
<?php
class Opinion_poll_model extends CI_Model
{
public function __construct()
{
parent::__construct();
$this->load->database();
}
public function total_votes()
{
$query = $this->db->select('COUNT(choice) as choices_count')->get('js_libraries');
return $query->row()->choices_count;
}
public function get_results()
{
$libraries = array("", "JQuery", "MooTools", "YUI Library", "Glow");
$table_rows = '';
for ($i = 1; $i < 5; $i++)
{
$query = $this->db->select('COUNT(choice) as choices_count')
->where('choice', $i)
->get('js_libraries');
$table_rows .= "<tr><td>" . $libraries[$i] . " Got:</td><td><b>" . $query->row()->choices_count . "</b> votes</td></tr>";
}
return $table_rows;
}
public function add_vote($choice)
{
$ts = date("Y-m-d H:i:s");
$data = array('choice' => $choice, 'ts' => $ts);
$this->db->insert('js_libraries', $data);
}
}
?>
AQUI,
- โclass Opinion_poll_model estende CI_Modelโฆโ รฉ o nosso modelo que estende o CI_Model
- โparent::__construct();โ chama o construtor CI_Model
- โ$this->carregar->banco de dados();โ carrega a biblioteca do banco de dados para que nosso aplicativo possa interagir com o banco de dados
- โ$this->db->โ รฉ CodeHistรณrico ativo do Igniter. Confira isto. link para obter mais informaรงรตes sobre o registro ativo.
Criando nosso controlador
Vamos agora criar o controlador. Usaremos o padrรฃo. CodeO controlador Igniter estรก localizado em application/controllers/welcome.php. Substitua seu cรณdigo-fonte pelo seguinte cรณdigo.
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
class Welcome extends CI_Controller {
public function __construct() {
parent::__construct();
$this->load->model('opinion_poll_model');
}
public function index() {
if ($this->input->post('submitbutton') && !$this->input->post('vote')) {
echo "<script>alert('You did not vote!');</script>";
}
if ($this->input->post('vote')) {
$this->opinion_poll_model->add_vote($this->input->post('vote'));
$data['total_votes'] = $this->opinion_poll_model->total_votes();
$data['rows'] = $this->opinion_poll_model->get_results();
$this->load->view('results', $data);
} else {
$this->load->view('opinion_poll_form');
}
}
}
/* End of file welcome.php */
/* Location: ./application/controllers/welcome.php */
?>
AQUI,
- โif (!definido('BASEPATH')) exit('Nรฃo รฉ permitido acesso direto ao script');โ garante que os usuรกrios nรฃo acessem diretamente a classe do controlador
- โclass Welcome estende CI_Controllerโฆโ nosso controlador estende a classe CI_Controller
- A funรงรฃo pรบblica โ__construct()โ chama o mรฉtodo construtor da classe CI_Controller e carrega nosso modelo Opinion_poll_model.
- โpublic function index()โฆโ รฉ a funรงรฃo que mapeia para index.php. Ela usa CodeA classe de entrada do Igniter verifica se um voto foi submetido, adiciona-o ao banco de dados e, em seguida, exibe os resultados. Se o array `post` da classe de entrada estiver vazio, a pรกgina de votaรงรฃo รฉ carregada.
- โ$this->input->post('โฆ')โ รฉ o CodeClasse de entrada do Igniter que obtรฉm o conteรบdo da variรกvel global $_POST.
- โ$this->opinion_poll_model->add_vote($this->input->post('vote'))โ chama o mรฉtodo add_vote do modelo para adicionar o voto ao banco de dados.
Criando nossas visualizaรงรตes
Relembrando o exemplo anterior, tรญnhamos duas pรกginas HTML, uma para votaรงรฃo e outra para resultados. Usaremos o mesmo cรณdigo HTML com modificaรงรตes mรญnimas para criar nossas visualizaรงรตes. Crie os seguintes arquivos no diretรณrio application/views.
opinion_poll_form.php
<html>
<head>
<title>
JavaScript Libraries - Opinion Poll
</title>
</head>
<body>
<h2>JavaScript Libraries - Opinion Poll</h2>
<p><b>What is your favorite JavaScript Library?</b></p>
<form method="POST" action="index.php">
<p>
<input type="radio" name="vote" value="1" /> JQuery
<br />
<input type="radio" name="vote" value="2" /> MooTools
<br />
<input type="radio" name="vote" value="3" /> YUI Library
<br />
<input type="radio" name="vote" value="4" /> Glow </p>
<p>
<input type="submit" name="submitbutton" value="OK" />
</p>
</form>
</body>
</html>
Vamos agora criar a pรกgina de resultados results.php
<html>
<head>
<title>JavaScript Libraries - Opinion Poll Results</title>
</head>
<body>
<h2>JavaScript Libraries - Opinion Poll Results</h2>
<p><b>What is your favorite JavaScript Library?</b></p>
<p><b><?php echo $total_votes; ?></b> people have thus far taken part in this poll:</p>
<p><table><tr><td>
<?php print($rows); ?>
</tr></td></table></p>
<p><a href="#">Return to voting page</a></p>
</body>
</html>
Testando nosso aplicativo
Supondo que o diretรณrio raiz do seu aplicativo seja ciopinionpoll, navegue atรฉ http://localhost/ciopinionpoll/
A pรกgina de votaรงรฃo acima vem da nossa visualizaรงรฃo opinion_poll_form. Clique em OK sem selecionar uma opรงรฃo e vocรช verรก a seguinte mensagem de alerta.
Vote na sua biblioteca favorita e clique em OK. Vocรช verรก a seguinte pรกgina de resultados.
Isso confirma que as trรชs camadas funcionam em conjunto: o controlador recebeu o voto, o modelo o armazenou e contabilizou, e a visualizaรงรฃo exibiu os totais.








