Padrões de Arquitetura em PHP: do MVC ao CQRS

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que a arquitetura decide tudo (e seu café não vai mais esfriar)

\n

Imagine que você está construindo uma casa. Dá para empilhar tijolos de qualquer jeito, prender com chiclete e torcer para que ela dure até o inverno. Ou então, projetar a fundação, as paredes e o telhado para que a casa resista a um furacão e até a uma visita dos parentes. No mundo PHP, é exatamente a mesma coisa. Os padrões de arquitetura são as plantas que transformam seu código de "funciona, e tá bom" para "funciona, escala e não te dá vontade de tomar um calmante".

\n

Quando comecei a programar em PHP, meus projetos eram monstros monolíticos. Em um único arquivo index.php, conviviam consultas SQL, HTML e lógica de negócio. Isso funcionava perfeitamente... até o cliente pedir uma nova funcionalidade. Aí vinha o caos. Hoje, vou te mostrar como evitar esse inferno. Vamos explorar os principais padrões de arquitetura em PHP — dos clássicos aos mais modernos. Vamos nessa!

\n\n

MVC (Model-View-Controller): o avô de todos os padrões

\n

Se você já programou em Laravel, Symfony ou Yii2, já encontrou o MVC. Este é o padrão arquitetural básico do PHP, que divide a aplicação em três partes:

\n
    \n
  • Model — dados e lógica de negócio (banco de dados, validação, cálculos).
  • \n
  • View — exibição (HTML, templates, JSON).
  • \n
  • Controller — o intermediário: recebe a requisição, chama o Model e passa os dados para a View.
  • \n
\n

O MVC resolve o principal problema: a separação de responsabilidades. Chega de SQL dentro do HTML. O código fica legível, testável e fácil de manter.

\n\n

Exemplo de MVC em PHP puro

\n
// Model: User.php\nclass User {\n    public function find(int $id): ?array {\n        $pdo = new PDO('mysql:host=localhost;dbname=teste', 'root', '');\n        $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n        $stmt->execute([$id]);\n        return $stmt->fetch() ?: null;\n    }\n}\n\n// Controller: UserController.php\nclass UserController {\n    public function show(int $id): void {\n        $userModel = new User();\n        $user = $userModel->find($id);\n        if (!$user) {\n            http_response_code(404);\n            echo 'Usuário não encontrado';\n            return;\n        }\n        // Passa os dados para a View\n        require 'views/user.php';\n    }\n}\n\n// View: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>Email: <?= htmlspecialchars($user['email']) ?></p>
\n

Quando usar: para aplicações web de complexidade média. Se você tem um blog simples ou uma loja virtual, o MVC é a escolha certa. Mas cuidado: se os controllers ficarem muito gordos (Fat Controllers), o padrão perde o sentido.

\n\n

Active Record: simplicidade e velocidade

\n

O padrão Active Record é quando um objeto representa ao mesmo tempo uma linha no banco de dados e a lógica de negócio. Lembra do Laravel Eloquent ou do Yii2 ActiveRecord? É ele. Cada modelo é tanto uma consulta ao banco quanto as regras de validação e os relacionamentos.

\n\n

Exemplo de Active Record (estilo Eloquent)

\n
class User extends ActiveRecord {\n    // Propriedades correspondem às colunas da tabela\n    public int $id;\n    public string $name;\n    public string $email;\n\n    public function save(): bool {\n        // Lógica de INSERT/UPDATE\n        if ($this->id) {\n            // UPDATE\n        } else {\n            // INSERT\n        }\n        return true;\n    }\n\n    public static function find(int $id): ?self {\n        // SELECT * FROM users WHERE id = $id\n    }\n}\n\n// Uso\n$user = new User();\n$user->name = 'João';\n$user->email = 'joao@exemplo.com';\n$user->save(); // Simples e direto
\n

Prós: rápido de escrever, intuitivo para iniciantes. Contras: viola o princípio da responsabilidade única (Single Responsibility do SOLID). O modelo sabe tanto sobre os dados quanto sobre como salvá-los. Para projetos complexos, isso pode se tornar um problema.

Blogs

Book Recommendations