Padrão de modelos: separando a lógica da visualização
Mova a lógica de negócio para arquivos PHP e mantenha os modelos HTML organizados.
Padrão de modelos: separando a lógica da visualização é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
Por que separar a lógica da visualização
Misturar consultas ao banco de dados, lógica de negócio e HTML no mesmo arquivo resulta em:
- Código espaguete difícil de ler
- Dificuldade para testar e reutilizar a lógica
- Falhas de segurança quando a validação é ignorada
A solução: mantenha cada responsabilidade em sua própria camada.
O padrão de modelo simples
Execute primeiro toda a lógica do PHP e depois gere o HTML:
<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
if (!$user) {
http_response_code(404);
require '404.php';
exit;
}
$pageTitle = 'Profile: ' . $user['name'];
// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
<h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>Separando os arquivos do controlador e da visualização
Divida o código em um arquivo de controlador e um arquivo de visualização:
// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
$posts = getPostsByUser($userId);
if (!$user) { require '404.php'; exit; }
require 'views/profile.view.php';
// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!Preparando os dados da visualização
Formate todos os dados na camada de lógica antes de enviá-los para a visualização:
<?php
$user = getUserById($id);
$viewData = [
'userName' => htmlspecialchars($user['name']),
'avatarUrl' => $user['avatar'] ?? '/default.png',
'joinedDate' => date('F Y', strtotime($user['created_at'])),
'isAdmin' => in_array('admin', $user['roles']),
];
extract($viewData); // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';Padrão de função de modelo
Envolva a renderização da visualização em uma função para facilitar a reutilização:
<?php
function render(string $view, array $data = []): void {
extract($data); // Create variables from array
require __DIR__ . '/views/' . $view . '.php';
}
// Usage:
render('profile', [
'name' => $user['name'],
'email' => $user['email'],
]);Mecanismo de modelos com bufferização da saída
Renderize um modelo e retorne-o como uma string:
<?php
function renderToString(string $view, array $data = []): string {
extract($data);
ob_start();
require __DIR__ . '/views/' . $view . '.php';
return ob_get_clean();
}
$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');Quando usar um mecanismo de modelos
Para sites simples, o sistema nativo de modelos do PHP é suficiente. Considere Twig ou Blade quando:
- Quiser o escape automático por padrão
- Os designers precisarem editar modelos sem conhecer PHP
- Precisar de herança de modelos e macros
- O projeto tiver muitas visualizações e crescer muito
Exemplo com Twig
Twig (usado pelo Symfony) fornece uma sintaxe limpa com escape automático:
<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig = new Twig\Environment($loader, ['cache' => '/tmp/twig']);
echo $twig->render('profile.html.twig', [
'user' => $user,
'posts' => $posts,
]);
// profile.html.twig:
// <h1>{{ user.name }}</h1> -- auto-escaped by defaultEstrutura de diretórios MVC
Um layout MVC mínimo para projetos PHP sem framework:
project/
controllers/
UserController.php -- handles request, calls model
models/
User.php -- database queries
views/
users/
profile.php -- display only, no logic
public/
index.php -- front controller (router)Padrão do controlador frontal
Encaminhe todas as solicitações por um único ponto de entrada:
<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';
if (isset($routes[$uri])) {
[$controller, $action] = $routes[$uri];
(new $controller)->$action();
} else {
http_response_code(404);
require '../views/404.php';
}Princípio da responsabilidade única
Cada arquivo deve ter um único motivo para ser alterado:
- Modelo: só muda quando a estrutura dos dados ou a lógica de consulta muda
- Controlador: só muda quando a lógica de tratamento de solicitações muda
- Visualização: só muda quando a interface do usuário ou o layout muda
Isso torna cada parte mais fácil de testar e manter de forma independente.
Verificação rápida
Qual é o principal benefício de separar a lógica do PHP do código de visualização HTML?
Recapitulação: padrão de modelos
Principais conclusões:
- Execute primeiro toda a lógica e depois gere o HTML
- Separe o código em arquivos de controlador e de visualização
- Use uma função render() com extract()
- A bufferização da saída captura o HTML renderizado
- Considere Twig ou Blade para projetos maiores
- O controlador frontal encaminha todas as solicitações para os manipuladores
Perguntas Frequentes
A aula “Padrão de modelos: separando a lógica da visualização” é grátis?
Sim — o texto completo de “Padrão de modelos: separando a lógica da visualização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Padrão de modelos: separando a lógica da visualização”?
Mova a lógica de negócio para arquivos PHP e mantenha os modelos HTML organizados. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Padrão de modelos: separando a lógica da visualização”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Tags do PHP e sintaxe de incorporação
- HTML dinâmico com loops do PHP
- Inclusão e exigência de arquivos
- Padrão de modelos: separando a lógica da visualização