Dicas e truques de PHP para desenvolvimento backend: Frameworks e bancos de dados

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.

:rocket: 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/"
        }
    }
}

:bullseye: Trabalhando com Frameworks

Laravel

Dicas principais:

  1. 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();
  1. Jobs e Queues: Desacople tarefas pesadas do request principal:
ProcessarPedido::dispatch($pedido)->onQueue('pagamentos');
  1. Service Container: Aproveite a injeção de dependências:
public function __construct(
    private readonly UserRepository $users,
    private readonly EmailService $mailer
) {}

Symfony

Dicas principais:

  1. Bundles modulares: Organize seu código em bundles reutilizáveis
  2. 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();
  1. Event Dispatcher: Desacople a lógica com eventos:
$dispatcher->dispatch(new UsuarioRegistradoEvent($usuario));

Slim/Lumen (Micro-frameworks)

Dicas principais:

  1. Middleware: Organize a lógica transversal (auth, logging, CORS)
  2. Mantenha as rotas limpas: Use controladores separados
  3. PSR-7/PSR-15: Adira aos padrões para melhor interoperabilidade

:floppy_disk: 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
}

:high_voltage: Dicas de desempenho

  1. OPcache ativado sempre em produção
  2. Use APCu ou Redis para cache de aplicação
  3. Lazy loading de recursos pesados
  4. Database connection pooling quando possível
  5. Monitore com ferramentas como New Relic ou Blackfire

:locked: 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)

:graduation_cap: Recursos recomendados

  • PHP.net documentation (sempre atualizada)
  • PHP: The Right Way (phptherightway.com)
  • Laracasts (para Laravel)
  • SymfonyCasts (para Symfony)

:thought_balloon: 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!