Cómo crear un colector de datos personalizado

El Generador de perfiles de Symfony2 delega la recolección de datos a los colectores de datos. Symfony2 incluye algunos colectores, pero puedes crear el tuyo fácilmente.

Creando un colector de datos personalizado

Crear un colector de datos personalizado es tan simple como implementar la clase Symfony\Component\HttpKernel\DataCollector\DataCollectorInterface:

interface DataCollectorInterface
{
    /**
     * Collects data for the given Request and Response.
     *
     * @param Request    $request   A Request instance
     * @param Response   $response  A Response instance
     * @param \Exception $exception An Exception instance
     */
    function collect(Request $request, Response $response, \Exception $exception = null);

    /**
     * Returns the name of the collector.
     *
     * @return string The collector name
     */
    function getName();
}

El método getName() debe devolver un nombre único. Este se utiliza para acceder a la información más adelante (consulta Cómo utilizar el generador de perfiles en una prueba funcional para ver un ejemplo).

El método collect() se encarga de almacenar los datos de las propiedades locales a las que quieres dar acceso.

Prudencia

Puesto que el generador de perfiles serializa instancias del colector de datos, no debes almacenar objetos que no se puedan serializar (como objetos PDO), o tendrás que proporcionar tu propio método serialize().

La mayoría de las veces, es conveniente extender Symfony\Component\HttpKernel\DataCollector\DataCollector y rellenar los datos de la propiedad $this->data (que se encarga de serializar la propiedad $this->data):

class MemoryDataCollector extends DataCollector
{
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->data = array(
            'memory' => memory_get_peak_usage(true),
        );
    }

    public function getMemory()
    {
        return $this->data['memory'];
    }

    public function getName()
    {
        return 'memory';
    }
}

Habilitando colectores de datos personalizados

Para habilitar un colector de datos, lo tienes que añadir como un servicio regular a tu configuración, y etiquetarlo con data_collector:

  • YAML
    services:
        data_collector.your_collector_name:
            class: Fully\Qualified\Collector\Class\Name
            tags:
                    - { name: data_collector }
    
  • XML
    <service id="data_collector.your_collector_name" class="Fully\Qualified\Collector\Class\Name">
        <tag name="data_collector" />
    </service>
    
  • PHP
    $container
        ->register('data_collector.your_collector_name', 'Fully\Qualified\Collector\Class\Name')
        ->addTag('data_collector')
    ;
    

Añadiendo el generador de perfiles web en plantillas

Cuando desees mostrar los datos recogidos por el colector de datos en la barra de depuración o el generador de perfiles web, crea una plantilla Twig siguiendo este esqueleto:

{% extends 'WebProfilerBundle:Profiler:layout.html.twig' %}

{% block toolbar %}
    {# La barra de herramientas para depuración de contenido web #}
{% endblock %}

{% block head %}
    {# Si el panel de perfiles web necesita algunos archivos CSS o JS específicos #}
{% endblock %}

{% block menu %}
    {# el menú de contenido #}
{% endblock %}

{% block panel %}
    {# el panel de contenido #}
{% endblock %}

Cada bloque es opcional. El bloque toolbar se utiliza para la barra de herramientas de depuración web menu y panel se utilizan para agregar un grupo especial al generador de perfiles web.

Todos los bloques tienen acceso al objeto collector.

Truco

Built-in templates use a base64 encoded image for the toolbar (<img src="data:image/png;base64,..."). Puedes calcular el valor base64 para una imagen con este pequeño guión: echo base64_encode(file_get_contents($_SERVER['argv'][1]));.

Para habilitar la plantilla, agrega un atributo template a la etiqueta data_collector en tu configuración. Por ejemplo, asumiendo que tu plantilla está en algún AcmeDebugBundle:

  • YAML
    services:
        data_collector.your_collector_name:
            class: Acme\DebugBundle\Collector\Class\Name
            tags:
                    - { name: data_collector, template: "AcmeDebugBundle:Collector:templatename", id: "your_collector_name" }
    
  • XML
    <service id="data_collector.your_collector_name" class="Acme\DebugBundle\Collector\Class\Name">
        <tag name="data_collector" template="AcmeDebugBundle:Collector:templatename" id="your_collector_name" />
    </service>
    
  • PHP
    $container
        ->register('data_collector.your_collector_name', 'Acme\DebugBundle\Collector\Class\Name')
        ->addTag('data_collector', array(
            'template' => 'AcmeDebugBundle:Collector:templatename',
            'id'       => 'your_collector_name',
        ))
    ;
    
Bifúrcame en GitHub