0Pricing
PHP Academy · Aula

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 default

Estrutura 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

  1. Tags do PHP e sintaxe de incorporação
  2. HTML dinâmico com loops do PHP
  3. Inclusão e exigência de arquivos
  4. Padrão de modelos: separando a lógica da visualização
← Voltar para PHP Academy