Friday, October 14, 2016

Collecting Data from Atlas ORM with PHP Debug Bar

In my last article, I talked about how I found an N+1 bug in Atlas ORM. #

I had mentioned how it took a little work to get PHP Debug Bar configured with Atlas but didn’t really explain why it was difficult, or how I got them working together. #

At first, it seemed like it would be easy. Debug Bar comes with a PDOCollector and Atlas is based on PDO. In Atlas\Orm\AtlasContainer it creates a new Aura\Sql\ConnectionLocator then creates and adds an Aura\Sql\ExtendedPdo connection to it. #

PHP Debug Bar requires you wrap your PDO connection in DebugBar\DataCollector\PDO\TraceablePDO which extends PDO. #

Aura\Sql\ExtendedPdo wraps a PDO connection and extends PDO however DebugBar\DataCollector\PDO\TraceablePDO is not a Aura\Sql\ExtendedPdo object. #

That means that I need to wrap PDO in DebugBar\DataCollector\PDO\TraceablePDO which is then wrapped in Aura\Sql\ExtendedPdo. #

There is no easy way of doing that without replacing some code. #

The first step is to create a new ExtendedPdo class that extends Aura\Sql\ExtendedPdo that overrides connect() which instantiates the PDO connection. We want to wrap the newly created connection in DebugBar\DataCollector\PDO\TraceablePDO. #

Next, we create a new AtlasContainer class that extends Atlas\Orm\AtlasContainer that overrides setConnectionLocator to instantiates my new ExtendedPdo instead of Aura\Sql\ExtendedPdo. #

Finally, we can use the DebugBar\DataCollector\PDO\PDOCollector which requires a DebugBar\DataCollector\PDO\TraceablePDO connection. We can get that out of our AtlasContainer like this: #

$pdo = $atlasContainer->getConnectionLocator()->getDefault()->getPdo();

To make this step easier I created AtlasOrmCollector which extends DebugBar\DataCollector\PDO\PDOCollector but expects my AtlasContainer instead of a PDO connection in the constructor. This way I can pull out the DebugBar\DataCollector\PDO\TraceablePDO connection and pass it to the parent constructor. #

I’ve packaged all of this up into the library AtlasOrm.DebugBar.Bridge which is also available on packagist as cadre/atlasorm-debugbar-bridge. #

You can now integrate PHP Debug Bar into your applications that use Atlas ORM as simply as this: #

$atlasContainer = new Cadre\AtlasOrmDebugBarBridge\AtlasContainer(
	'mysql:host=localhost;dbname=testdb',
	'username',
	'password'
);
$debugbar = new DebugBar\StandardDebugBar();
$debugbar->addCollector(
	new Cadre\AtlasOrmDebugBarBridge\AtlasOrmCollector($atlasContainer)
);
Published by Andrew Shell on and last updated .