Skip to content

ahmed-bhs/doctrine-doctor

Repository files navigation

Doctrine Doctor

Doctrine Doctor Logo

Runtime Analysis Tool for Doctrine ORM — Integrated into Symfony Web Profiler

PHP 8.4+ Symfony 6.x | 7.x | 8.x Doctrine ORM License MIT CI PHPStan Level 8 Code Style Packagist Version

Why Runtime Analysis?

Unlike static analysis tools (PHPStan, Psalm) that analyze code without execution, Doctrine Doctor:

  • Detects runtime doctrine issues by analyzing real execution context (actual parameters, data volume, query plans), including N+1 queries, real query performance bottlenecks, and missing indexes.
  • Integrated into your workflow: Results appear directly in Symfony Web Profiler during development
    • 📍 Backtrace: Points to exact template line
    • 💡 Suggestion: Use ->addSelect(..) to eager load products

Doctrine Doctor Demo


Features

66 Specialized Analyzers

  • Performance — Detects N+1 queries, missing database indexes, slow queries, excessive hydration, findAll() without limits, setMaxResults() with collection joins, too many JOINs, and query caching opportunities
  • Security — Identifies DQL/SQL injection vulnerabilities, QueryBuilder SQL injection risks, sensitive data exposure in serialization, unprotected sensitive fields, and insecure random generators
  • Integrity — Detects cascade configuration issues, bidirectional inconsistencies, missing orphan removal, type mismatches, float usage for money, uninitialized collections, EntityManager in entities, and architectural violations
  • Configuration — Validates database charset/collation settings, timezone handling, Gedmo trait configurations, MySQL strict mode, and other database-level configurations

⚡ Quick Start (30 seconds)

Step 1: Install

composer require --dev ahmed-bhs/doctrine-doctor

Step 2: That's it!

Auto-configured via Symfony Flex. No YAML, no configuration files needed.

Step 3: See it in action

  1. Refresh any page in your Symfony app (in dev environment)
  2. Open the Symfony Web Profiler (bottom toolbar)
  3. Click the "Doctrine Doctor" panel 🩺

Configuration (Optional)

Configure thresholds in config/packages/dev/doctrine_doctor.yaml:

doctrine_doctor:
    analyzers:
        n_plus_one:
            threshold: 5  # default, lower to 3 to be stricter
        slow_query:
            threshold: 100  # milliseconds (default)

Enable backtraces to see WHERE in your code issues originate:

# config/packages/dev/doctrine.yaml
doctrine:
    dbal:
        profiling_collect_backtrace: true

Full configuration reference →


Example: N+1 Query Detection

Before — 100 queries After — 1 query
$users = $repository->findAll();
{% for user in users %}
    {{ user.profile.bio }}
{% endfor %}
$users = $repository
    ->createQueryBuilder('u')
    ->leftJoin('u.profile', 'p')
    ->addSelect('p')
    ->getQuery()
    ->getResult();

Doctrine Doctor detects the N+1 pattern at runtime — reports query count, execution time, points to the exact template line, and suggests eager loading with addSelect().


Documentation

Document Description
Full Analyzers List Complete catalog of all 66 analyzers covering performance, security, integrity, and configuration - find the perfect analyzer for your specific needs
Architecture Guide Deep dive into system design, architecture patterns, and technical internals - understand how Doctrine Doctor works under the hood
Configuration Reference Comprehensive guide to all configuration options - customize analyzers, thresholds, and outputs to match your workflow
Template Security Essential security best practices for PHP templates - prevent XSS attacks and ensure safe template rendering

Contributing

See Contributing Guide for guidelines.

License

MIT License - see LICENSE for details.

About

🩺⚡ Runtime Doctrine ORM analysis integrated into Symfony Web Profiler. Detect N+1 queries, security vulnerabilities, and performance issues during query execution.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors