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: