Bundle de Symfony
Páginas vistas automáticas del lado del servidor vía kernel.terminate y configuración semántica. Compatible con Symfony 6.4 y 7, PHP ≥ 8.1.
Instalación
composer require quiet-metrics/symfony-metrics
symfony-metrics aún no está en Packagist. Declare su repositorio de GitHub (acceso requerido); el paquete núcleo viene de Packagist:
{ "repositories": [ { "type": "vcs", "url": "https://github.com/Quiet-Metrics/symfony-metrics" } ] }
Sin Symfony Flex, registre el bundle:
// config/bundles.php return [ // … QuietMetrics\Symfony\QuietMetricsBundle::class => ['all' => true], ];
Configuración
# config/packages/quiet_metrics.yaml quiet_metrics: public_key: '%env(QUIET_METRICS_PUBLIC_KEY)%' # clave pública del sitio (obligatoria) secret_key: '%env(QUIET_METRICS_SECRET_KEY)%' # opcional: firma cada envío (HMAC) # endpoint: 'https://quietmetrics.dev/api/v1/collect' # valor por defecto del SDK núcleo # auto_pageview: false # desactiva la página vista automática
Por entorno, sobrescriba en config/packages/test/quiet_metrics.yaml o mediante las variables de entorno; sin una clave pública válida, no se envía nada.
Páginas vistas automáticas
El listener escucha kernel.terminate: la respuesta ya ha llegado al visitante, el envío no añade ninguna latencia percibida. Solo se cuentan las respuestas HTML de peticiones GET exitosas (ni XHR, ni errores, ni API JSON): sus endpoints REST no contaminan las estadísticas.
auto_pageview: false desactiva el listener: usted conserva el cliente para envíos manuales (sitios mixtos, seguimiento selectivo).
Eventos
Inyecte el cliente (servicio público):
use QuietMetrics\Client; final class CheckoutController { public function __construct(private readonly Client $quietMetrics) {} public function confirm(): Response { // … $this->quietMetrics->event('compra', ['importe' => 49, 'plan' => 'pro']); } }
Desde un comando de consola o un worker de Messenger, no existe una petición en curso: pase la URL explícitamente, de lo contrario no se envía nada (descarte silencioso):
$this->quietMetrics->event('importacion-completada', ['filas' => 1200], [ 'url' => 'https://misitio.es/imports', ]);
Casos particulares
FrankenPHP, RoadRunner, workers persistentes. El listener lee el objeto Request de cada petición, nunca las superglobales. Nada que configurar.
Reverse proxy / CDN. El listener utiliza Request::getClientIp(): configure framework.trusted_proxies como de costumbre y la IP real del visitante seguirá. La opción trust_proxy_headers del SDK solo concierne a los usos fuera del framework.
Tests. Sustituya el servicio por un stub para verificar sus eventos sin red:
# config/services_test.yaml services: QuietMetrics\Client: class: App\Tests\Double\NullQuietMetricsClient
Contrato de robustez
Envío no bloqueante (socket fire-and-forget, respaldo cURL corto), fallos silenciosos: la analítica nunca rompe la aplicación anfitriona, incluso si la plataforma está inaccesible.
¿No encuentra su respuesta?
El soporte responde en días laborables.