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.