Bundle Symfony
Pageviews serveur automatiques via kernel.terminate et configuration sémantique. Compatible Symfony 6.4 et 7, PHP ≥ 8.1.
Installation
composer require quiet-metrics/symfony-metrics
Sans Symfony Flex, enregistrez le bundle :
// config/bundles.php return [ // … QuietMetrics\Symfony\QuietMetricsBundle::class => ['all' => true], ];
Mettre à jour
Chaque version mineure 0.x du bundle exige la version mineure correspondante du SDK cœur quiet-metrics/php-metrics : montez les deux ensemble, et eux seuls.
composer require quiet-metrics/symfony-metrics:^0.5 --no-update composer update quiet-metrics/symfony-metrics quiet-metrics/php-metrics
Un simple composer require échoue, car le SDK cœur est verrouillé dans composer.lock. Le message d'erreur de Composer propose alors -W, qui met à jour toutes les dépendances du projet ; -w monterait aussi des composants Symfony. Lisez le CHANGELOG du paquet avant de monter : il signale les changements dans ce qui est compté.
Configuration
# config/packages/quiet_metrics.yaml quiet_metrics: public_key: '%env(QUIET_METRICS_PUBLIC_KEY)%' # clé publique du site (obligatoire) secret_key: '%env(QUIET_METRICS_SECRET_KEY)%' # indispensable en envoi serveur : signe chaque envoi (HMAC) # endpoint: 'https://quietmetrics.dev/api/v1/collect' # défaut du SDK cœur # auto_pageview: false # désactive la pageview automatique
Par environnement, surchargez dans config/packages/test/quiet_metrics.yaml ou via les variables d'environnement : sans clé publique valide, rien n'est envoyé.
Pageviews automatiques
Les pages vues automatiques sont les documents HTML/XHTML affichés en réponse à un GET, y compris les erreurs 404/500. Les redirections, réponses vides (204/205), PDF, JSON et pièces jointes sont exclus, ainsi que l’AJAX, les préchargements annoncés et les visiteurs exclus.
À partir de la version 0.4.0, track_404: true active en plus un événement 404 avec le chemin de la page. Cette option est désactivée par défaut : chaque événement supplémentaire consomme le quota. Activez-la côté serveur ou via data-404 dans le script sur une même page, pour éviter un double événement. Le suivi ne voit pas les pages servies par un cache qui contourne PHP.
auto_pageview: false coupe le listener : vous gardez le client pour des envois manuels (sites mixtes, tracking sélectif).
Événements
Injectez QuietMetrics\Tracker, l'interface que le client implémente (service public ; QuietMetrics\Client avant la version 0.5.0) :
use QuietMetrics\Tracker; final class CheckoutController { public function __construct(private readonly Tracker $quietMetrics) {} public function confirm(): Response { // … $this->quietMetrics->event('achat', ['montant' => 49, 'plan' => 'pro']); } }
Depuis une commande console ou un worker Messenger, il n'y a pas de requête courante : passez l'URL explicitement, sinon rien ne part (abandon silencieux) :
$this->quietMetrics->event('import-termine', ['lignes' => 1200], [ 'url' => 'https://monsite.fr/imports', ]);
Cas particuliers
Cache pleine page (Varnish, Cloudflare, cache de réponses…). Une page servie depuis un cache placé devant votre application n'exécute pas PHP : sa visite n'est pas comptée. Laissez ces pages hors du cache, ou ajoutez aussi le script qm.js : les deux mesures cohabitent sans double compte.
FrankenPHP, RoadRunner, workers persistants. Le listener lit l'objet Request de chaque requête, jamais les superglobales. Rien à configurer.
Reverse proxy / CDN. Le listener utilise Request::getClientIp() : configurez framework.trusted_proxies comme d'habitude et l'IP réelle du visiteur suivra. L'option trust_proxy_headers du SDK ne concerne que les usages hors framework.
Ce qui est transmis. À partir de la version 0.5.0, le SDK ne transmet que ce que Quiet Metrics lit : l'adresse de la page réduite à son origine, à son chemin et à ses paramètres de campagne, et le référent réduit à son origine. Détail dans le SDK PHP.
Tests. Remplacez le service QuietMetrics\Tracker par votre propre implémentation pour vérifier vos événements sans réseau. Le client est final : on ne l'étend pas, on remplace l'interface qu'il implémente (version 0.5.0 et suivantes).
# config/services_test.yaml services: QuietMetrics\Tracker: class: App\Tests\Double\RecordingTracker
Votre code doit alors typer QuietMetrics\Tracker, comme dans l'exemple des événements.
Contrat de robustesse
Envoi non bloquant (socket fire-and-forget, repli cURL court), échecs silencieux : l'analytics ne casse jamais l'application hôte, même si la plateforme est injoignable.
Vous ne trouvez pas votre réponse ?
Le support répond en français, les jours ouvrés.