Dicas e truques de PHP para desenvolvimento backend: Frameworks e bancos de dados
PHP continua sendo uma das tecnologias mais utilizadas no desenvolvimento backend, e com razão. Seu ecossistema maduro, ampla comunidade e evolução constante o tornam uma opção sólida para projetos de qualquer escala. Neste post, compartilharei dicas práticas para trabalhar com PHP em diferentes frameworks e bancos de dados.
Melhores práticas gerais de PHP
1. Use tipagem estrita
Desde PHP 7.0, a tipagem estrita melhora a qualidade do código e reduz erros:
declare(strict_types=1);
function calcularTotal(float $preco, int $cantidad): float {
return $preco * $cantidad;
}
2. Aproveite as características modernas
PHP 8.x introduziu características poderosas:
- Named arguments: Melhoram a legibilidade
- Match expressions: Alternativa mais limpa para switch
- Nullsafe operator: Reduz verificações nulas
- Enums: Tipos seguros para valores constantes
// Named arguments
$resultado = buscarUsuario(
nome: 'Juan',
ativo: true,
limite: 10
);
// Match expression
$mensagem = match($codigo) {
200 => 'Sucesso',
404 => 'Não encontrado',
500 => 'Erro do servidor',
default => 'Código desconhecido'
};
3. Composer é seu aliado
Gere dependências profissionalmente e aproveite o autoloading PSR-4:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
Trabalhando com Frameworks
Laravel
Dicas principais:
- Use Eloquent com critério: Os modelos são poderosos, mas não abuse das consultas N+1. Use
with()para eager loading:
// ❌ Ruim: N+1 queries
$posts = Post::all();
foreach ($posts as $post) {
echo $post->autor->nome;
}
// ✅ Bom: Uma query com join
$posts = Post::with('autor')->get();
- Jobs e Queues: Desacople tarefas pesadas do request principal:
ProcessarPedido::dispatch($pedido)->onQueue('pagamentos');
- Service Container: Aproveite a injeção de dependências:
public function __construct(
private readonly UserRepository $users,
private readonly EmailService $mailer
) {}
Symfony
Dicas principais:
- Bundles modulares: Organize seu código em bundles reutilizáveis
- Doctrine Query Builder: Mais flexível que DQL puro:
$query = $em->createQueryBuilder()
->select('u')
->from('App\Entity\Usuario', 'u')
->where('u.ativo = :ativo')
->setParameter('ativo', true)
->orderBy('u.nome', 'ASC')
->getQuery();
- Event Dispatcher: Desacople a lógica com eventos:
$dispatcher->dispatch(new UsuarioRegistradoEvent($usuario));
Slim/Lumen (Micro-frameworks)
Dicas principais:
- Middleware: Organize a lógica transversal (auth, logging, CORS)
- Mantenha as rotas limpas: Use controladores separados
- PSR-7/PSR-15: Adira aos padrões para melhor interoperabilidade
Otimização com bancos de dados
MySQL/MariaDB
1. Índices estratégicos:
-- Para buscas frequentes
CREATE INDEX idx_usuario_email ON usuarios(email);
-- Índices compostos para queries complexas
CREATE INDEX idx_pedido_fecha_estado ON pedidos(fecha_creacion, estado);
2. Prepared Statements sempre:
$stmt = $pdo->prepare('SELECT * FROM usuarios WHERE email = ?');
$stmt->execute([$email]);
3. EXPLAIN é seu amigo:
Analise queries lentas antes de otimizar.
PostgreSQL
1. JSONB para dados semi-estruturados:
// Em Laravel/Eloquent
$usuarios = Usuario::where('metadata->nivel', '>', 5)->get();
2. Full-text search nativo:
CREATE INDEX idx_productos_busqueda ON produtos
USING gin(to_tsvector('spanish', nome || ' ' || descrição));
3. Particionamento de tabelas grandes:
Útil para logs e dados históricos.
MongoDB (com extensão oficial)
1. Projeções para reduzir dados transferidos:
$usuarios = $collection->find(
['ativo' => true],
['projection' => ['nome' => 1, 'email' => 1]]
);
2. Agregações para análises complexas:
$resultado = $collection->aggregate([
['$match' => ['status' => 'completado']],
['$group' => [
'_id' => '$categoria',
'total' => ['$sum' => '$monto']
]]
]);
Redis (cache e sessions)
1. Cache de queries caras:
$usuarios = Cache::remember('usuarios_ativos', 3600, function() {
return Usuario::where('ativo', true)->get();
});
2. Rate limiting:
$key = "rate_limit:api:{$userId}";
$intentos = Redis::incr($key);
if ($intentos === 1) {
Redis::expire($key, 60); // 60 segundos
}
Dicas de desempenho
- OPcache ativado sempre em produção
- Use APCu ou Redis para cache de aplicação
- Lazy loading de recursos pesados
- Database connection pooling quando possível
- Monitore com ferramentas como New Relic ou Blackfire
Segurança básica
- Nunca confie em input do usuário
- Use password_hash() e password_verify()
- Configure corretamente os headers de segurança
- Mantenha PHP e dependências atualizadas
- Use variáveis de ambiente para credenciais (.env)
Recursos recomendados
- PHP.net documentation (sempre atualizada)
- PHP: The Right Way (phptherightway.com)
- Laracasts (para Laravel)
- SymfonyCasts (para Symfony)
Conclusão
PHP moderno é uma linguagem robusta e eficiente quando utilizada corretamente. A chave está em conhecer bem o framework escolhido, otimizar as interações com o banco de dados e seguir boas práticas de desenvolvimento.
Quais outros conselhos adicionariam? Há algum framework ou banco de dados específico sobre o qual queiram se aprofundar? Leio nos comentários!
