Por que a arquitetura decide tudo (e seu café não vai mais esfriar)
\nImagine 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".
\nQuando 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!
MVC (Model-View-Controller): o avô de todos os padrões
\nSe 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
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\nExemplo 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>\nQuando 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\nActive Record: simplicidade e velocidade
\nO 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\nExemplo de Active Record (estilo Eloquent)
\nclass 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\nPró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.