Depura tus aplicaciones Symfony como un profesional

Ladybug es una librería que simplifica la depuración de aplicaciones PHP. Ladybug reemplaza a las tradicionales funciones var_dump() y print_r() de una manera mucho más útil y eficaz. Ladybug ha sido creado por Raúl Fraile y se integra perfectamente con Symfony2.

Instalación

Si programas aplicaciones con Symfony lo mejor es que instales el bundle de LadyBug, que ya incluye la librería LadyBug.

Para ello, añade en primer lugar la siguiente dependencia en tu archivo composer.json:

{
  "require": {
      "raulfraile/ladybug-bundle": "dev-master"
  }
}

Después, instala las nuevas dependencias ejecutando el siguiente comando:

$ composer update

(Para que te funcione el anterior comando, debes tener instalado Composer globalmente, tal y como se explica en la guía de instalación de Composer)

Por último, registra el nuevo bundle en el archivo AppKernel.php:

<?php
// app/AppKernel.php
 
public function registerBundles()
{
    $bundles = array(
        // ...
        new RaulFraile\Bundle\LadybugBundle\RaulFraileLadybugBundle(),
    );
    // ...
}

Si todavía utilizas Symfony 2.0, puedes consultar las instrucciones de instalación de Ladybug en Symfony 2.0.

Configuración

Ladybug ya está configurado y listo para usar nada más descargarlo, pero si quieres modificar su comportamiento, puedes utilizar las siguientes opciones de configuración:

# app/config/config.yml
raul_fraile_ladybug:  
    # indica si por defecto las variables muestran expandidos sus contenidos
    general:
        expanded:             true 
    object:
        # si utilizas objetos complejos, aumenta este número
        max_nesting_level:    3
        # utiliza el valor 'false' para ocultar cada parte del objeto
        show_data:            true
        show_classinfo:       true
        show_constants:       true
        show_methods:         true
        show_properties:      true
    # si utilizas colecciones y arrays muy complejos, aumenta este número
    array:                
        max_nesting_level:    8 
    processor:            
        active:               true 
    bool:                 
        html_color:           #008 
        cli_color:            blue 
    float:                
        html_color:           #800 
        cli_color:            red 
    int:                  
        html_color:           #800 
        cli_color:            red 
    string:               
        html_color:           #080 
        cli_color:            green 
        show_quotes:          true 
    css:                  
        path:                 /asset/tree.min.css

Depurando como un profesional

Imagina que un determinado controlador de tu aplicación Symfony no está mostrando la información adecuada. En vez de buscar en los logs de Symfony o en el profiler la consulta a la base de datos, decides hacer un var_dump() directamente sobre la entidad de Doctrine2. Un minuto después el navegador se te cuelga debido a las infinitas recursiones de los objetos de Doctrine2.

Con Ladybug solo tienes que añadir una llamada al método ld() (o su equivalente más largo llamado ladybug_dump()) para mostrar el contenido de esa variable:

<?php
// ...
 
class DefaultController extends Controller
{
    public function portadaAction($ciudad)
    {
        $em = $this->getDoctrine()->getEntityManager();
        $oferta = $em->getRepository('OfertaBundle:Oferta')->findOferta($ciudad);
 
        ld($oferta);
 
        // ...
    }
}

Ahora en el navegador verás algo como lo siguiente:

Volcado de una variable con Ladybug

Ladybug muestra el nombre y valor de todas las propiedades de la entidad, sus métodos, la ruta del archivo que guarda la clase PHP, etc. Además, si una propiedad es de tipo clase de PHP (como la propiedad fecha_publicacion de tipo DateTime) Ladybug muestra un enlace directo al manual oficial de PHP.

Si además de mostrar el contenido de una variable quieres detener la ejecución de la aplicación en ese punto, reemplaza por ld() por ldd() (que es un atajo del método ladybug_dump_die()).

Puedes pasar tantas variables como quieras a los métodos ld() y ldd() para ver sus contenidos. Además, no importa lo complejo o raro que sea el contenido de la variable, ya que Ladybug nunca colgará tu navegador. La siguiente imagen muestra el volcado de todo el contenedor de inyección de dependencias de Symfony2 (ld($this->container)):

Volcado del contendor de Symfony2

Además de ver cómodamente todos los servicios, parámetros y métodos del contenedor, Ladybug añade enlaces directos a la documentación de la API de Symfony (solo tienes que pinchar en esos pequeños iconos de Symfony que ves en el volcado de la variable).

Ladybug también cuenta con otros métodos interesantes:

  • ladybug_dump_ini([$extension]), vuelca todas las opciones de configuración de PHP o de la extensión que le indiques.
  • ladybug_dump_ext(), vuelca todas las extensiones de PHP que están cargadas.
  • ladybug_dump_return($formato, $variable[, $variable2, ...]), devuelve el volcado de los contenidos de las variables en el formato indicado en el argumento $formato. Este formato puede ser YML, JSON, XML y PHP.

La única limitación es que en las plantillas Twig solo existe un filtro definido para Ladybug. Se trata del filtro correspondiente al método ld():

{# volcar el contenido de la variable 'oferta' #}
{{ oferta | ld }}
 
{# ... #}

Por último, si utilizas el bundle de Ladybug para Symfony también puedes volcar las variables directamente al profiler de Symfony, en vez de mostrarlas por pantalla. Para ello, utiliza el método log() del servicio ladybug:

<?php
// ...
 
class DefaultController extends Controller
{
    public function portadaAction($ciudad)
    {
        $em = $this->getDoctrine()->getEntityManager();
        $oferta = $em->getRepository('OfertaBundle:Oferta')->findOferta($ciudad);
 
        $this->get('ladybug')->log($oferta);
 
        // ...
    }
}

Activación selectiva del bundle

Como cualquier otro bundle relacionado con la depuración de aplicaciones, se recomienda activarlo solamente cuando ejecutes la aplicación en el entorno de desarrollo.

Para ello, no registres el bundle tal y como se mostró anteriormente, y utiliza en su lugar el siguiente código:

<?php
// app/AppKernel.php
 
public function registerBundles()
{
    // ...
 
    if (in_array($this->getEnvironment(), array('dev', 'test'))) {
        // ...
        $bundles[] = new RaulFraile\Bundle\LadybugBundle\RaulFraileLadybugBundle();
    }
}

Otros recursos

Compartir en

¿Has visto algún error?

Avísanos en [email protected] para que podamos corregirlo. Gracias.

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.