Doctrine 2 extension offers a number of logger to view details of executed sql queries.

In this post I'll show how to implement a FirePHP logger.

Step 1:

If you try to call FirePHP in the code you get this error:

Error: FirePHP Class not found

To fix this, declare FirePHP in the file Application/autoload_classmap.php

<?php
return array(
    'FirePHP' => 'FirePHPCore/FirePHP.class.php',
);

And in file Application/Module.php change the getAutoloaderConfig function to load the class map file:

<?php
public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\ClassMapAutoloader' => array(
            __DIR__ . '/autoload_classmap.php',
        ),
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__,
            ),
        ),
    );
}

Step 2:

Create the profiler class.

File: Application/Profiler/FirePhpProfiler.php

<?php
namespace Application\Profiler;

class FirePhpProfiler implements \Doctrine\DBAL\Logging\SQLLogger
{
    private $enabled      = true;
    private $start        = 0;
    private $end          = 0;
    private $queries      = array();
    private $currentQuery = null;

    /**
     * $logger FirePHP
     */
    private $logger;

    public function __construct()
    {
        $this->logger    = new \FirePHP();
        $this->queries[] = array('Time', 'Query', 'Parameters');
    }

    /**
     * {@inheritdoc}
     */
    public function startQuery($sql, array $params = null, array $types = null)
    {
        if (! $this->start) {
            $this->start = \microtime(true);
        }

        $this->currentQuery            = new \stdClass();
        $this->currentQuery->sql       = $sql;
        $this->currentQuery->params    = $params;
        $this->currentQuery->types     = $types;
        $this->currentQuery->startTime = \microtime(true);
    }

    /**
     * {@inheritdoc}
     */
    public function stopQuery()
    {
        $executionTime = \microtime(true) - $this->currentQuery->startTime;

        $this->queries[] = array(
            number_format($executionTime, 4),
            $this->currentQuery->sql,
            $this->currentQuery->params,
        );

        $this->end = \microtime(true);
    }

    /**
     * showTable dispaly FirePHP table
     */
    public function showTable()
    {
        if (headers_sent()) {
            return;
        }

        if (! empty($this->queries) && count($this->queries) > 1) {
            $this->logger->table(
                sprintf(
                    'Doctrine Queries (%d @ %s sec)',
                    count($this->queries) - 1,
                    number_format($this->end - $this->start, 4)
                ),
                $this->queries
            );
        }
    }
}

Step 3:

Add the created profiler to service manager

File: Application/Module.php

<?php
public function getServiceConfig()
{
    return array(
        'invokables' => array(
            'FirePhpProfiler' => 'Application\Profiler\FirePhpProfiler',
        ),
    );
}

Step 4:

Add the profiler to Doctrine EntityManager and attach new event to launch the profiler.

File: Application/Module.php

<?php
use Zend\Mvc\MvcEvent;

public function onBootstrap(MvcEvent $e)
{
    $serviceManager = $e->getApplication()->getServiceManager();
    $eventManager   = $e->getApplication()->getEventManager();

    $serviceManager->get('doctrine.entitymanager.orm_default')
        ->getConfiguration()->setSQLLogger($serviceManager->get('FirePhpProfiler'));

    $eventManager->attach(
        MvcEvent::EVENT_FINISH,
        function ($e) use ($serviceManager) {
            $profiler = $serviceManager->get('FirePhpProfiler');
            $profiler->showTable();
        },
        100
    );
}

Finally:

The end result show in Firebug:

PhpFirebug result demo