Le besoin

Le dashboard EasyAdmin tourne sur la base applicative. Mais les stats de fréquentation viennent d'une base d'analytics séparée. Je voulais afficher ces chiffres directement dans le dashboard.

Le piège

On ne mélange pas deux bases avec une seule connexion Doctrine :

// Echoue : la table analytics n'existe pas dans la base applicative
$this->em->getRepository(PageView::class)->count([]);

La solution — deux connexions

# config/packages/doctrine.yaml
doctrine:
    dbal:
        connections:
            default: { url: '%env(DATABASE_URL)%' }
            tracker: { url: '%env(TRACKER_DATABASE_URL)%' }

Pour de l'agrégation read-only, le DBAL brut est plus direct que l'ORM :

public function __construct(
    #[Autowire(service: 'doctrine.dbal.tracker_connection')]
    private Connection $tracker,
) {}

public function getStats(): array
{
    return [
        'views_today' => (int) $this->tracker->fetchOne(
            'SELECT COUNT(*) FROM page_views WHERE DATE(created_at) = CURDATE()'
        ),
        'top_pages' => $this->tracker->fetchAllAssociative(
            'SELECT path, COUNT(*) AS hits FROM page_views
             GROUP BY path ORDER BY hits DESC LIMIT 10'
        ),
    ];
}

Ce que je retiens

  • Multi-base = plusieurs connexions Doctrine bien nommées.
  • Pour de l'agrégation read-only, le DBAL est plus direct que l'ORM.
  • Garder l'analytics dans sa propre base : découplage propre.