Skip to content

Commit

Permalink
Zend Developer Tools integration based on #51 logs implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
jhuet committed Dec 1, 2012
1 parent 42c0e3b commit 983c198
Show file tree
Hide file tree
Showing 6 changed files with 546 additions and 0 deletions.
25 changes: 25 additions & 0 deletions config/module.config.php
Expand Up @@ -54,6 +54,10 @@
) )
), ),


'mongo_logger_collector' => array(
'odm_default' => array(),
),

'authentication' => array( 'authentication' => array(
'odm_default' => array( 'odm_default' => array(
'objectManager' => 'doctrine.documentmanager.odm_default', 'objectManager' => 'doctrine.documentmanager.odm_default',
Expand All @@ -63,4 +67,25 @@
), ),
), ),
), ),

// zendframework/zend-developer-tools specific settings

'view_manager' => array(
'template_map' => array(
'zend-developer-tools/toolbar/doctrine-odm' => __DIR__ . '/../view/zend-developer-tools/toolbar/doctrine-odm.phtml',
),
),

'zenddevelopertools' => array(
'profiler' => array(
'collectors' => array(
'odm_default' => 'doctrine.mongo_logger_collector.odm_default',
),
),
'toolbar' => array(
'entries' => array(
'odm_default' => 'zend-developer-tools/toolbar/doctrine-odm',
),
),
),
); );
117 changes: 117 additions & 0 deletions src/DoctrineMongoODMModule/Collector/MongoLoggerCollector.php
@@ -0,0 +1,117 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace DoctrineMongoODMModule\Collector;


use ZendDeveloperTools\Collector\CollectorInterface;
use ZendDeveloperTools\Collector\AutoHideInterface;

use Zend\Mvc\MvcEvent;

use DoctrineMongoODMModule\Logging\DebugStack;

/**
* Collector to be used in ZendDeveloperTools to record and display Mongo
* queries
*
* @license MIT
* @link www.doctrine-project.org
*/
class MongoLoggerCollector implements CollectorInterface, AutoHideInterface
{
/**
* Collector priority
*/
const PRIORITY = 10;

/**
* @var DebugStack
*/
protected $mongoLogger;

/**
* @var string
*/
protected $name;

/**
* @param DebugStack $mongoLogger
* @param string $name
*/
public function __construct(DebugStack $mongoLogger, $name)
{
$this->mongoLogger = $mongoLogger;
$this->name = (string) $name;
}

/**
* {@inheritDoc}
*/
public function getName()
{
return $this->name;
}

/**
* {@inheritDoc}
*/
public function getPriority()
{
return static::PRIORITY;
}

/**
* {@inheritDoc}
*/
public function collect(MvcEvent $mvcEvent)
{
}

/**
* {@inheritDoc}
*/
public function canHide()
{
return empty($this->mongoLogger->queries);
}

/**
* @return int
*/
public function getQueryCount()
{
return count($this->mongoLogger->queries);
}

/**
* @return array
*/
public function getQueries()
{
return $this->mongoLogger->queries;
}

/**
* @return float
*/
public function getQueryTime()
{
return 0.0;
}
}
9 changes: 9 additions & 0 deletions src/DoctrineMongoODMModule/Module.php
Expand Up @@ -50,6 +50,14 @@ public function onBootstrap(EventInterface $event)


// Attach to helper set event and load the document manager helper. // Attach to helper set event and load the document manager helper.
$sharedManager->attach('doctrine', 'loadCli.post', array($this, 'loadCli')); $sharedManager->attach('doctrine', 'loadCli.post', array($this, 'loadCli'));

$config = $app->getServiceManager()->get('Configuration');
if (
isset($config['zenddevelopertools']['profiler']['enabled'])
&& $config['zenddevelopertools']['profiler']['enabled']
) {
$app->getServiceManager()->get('doctrine.mongo_logger_collector.odm_default');
}
} }


/** /**
Expand Down Expand Up @@ -119,6 +127,7 @@ public function getServiceConfig()
'doctrine.driver.odm_default' => new CommonService\DriverFactory('odm_default'), 'doctrine.driver.odm_default' => new CommonService\DriverFactory('odm_default'),
'doctrine.documentmanager.odm_default' => new ODMService\DocumentManagerFactory('odm_default'), 'doctrine.documentmanager.odm_default' => new ODMService\DocumentManagerFactory('odm_default'),
'doctrine.eventmanager.odm_default' => new CommonService\EventManagerFactory('odm_default'), 'doctrine.eventmanager.odm_default' => new CommonService\EventManagerFactory('odm_default'),
'doctrine.mongo_logger_collector.odm_default' => new ODMService\MongoLoggerCollectorFactory('odm_default'),
) )
); );
} }
Expand Down
100 changes: 100 additions & 0 deletions src/DoctrineMongoODMModule/Options/MongoLoggerCollector.php
@@ -0,0 +1,100 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace DoctrineMongoODMModule\Options;

use Zend\Stdlib\AbstractOptions;

/**
* Configuration options for a collector
*
* @license MIT
* @link http://www.doctrine-project.org/
*/
class MongoLoggerCollector extends AbstractOptions
{
/**
* @var string name to be assigned to the collector
*/
protected $name = 'odm_default';

/**
* @var string|null service name of the configuration where the logger has to be put
*/
protected $configuration;

/**
* @var string|null service name of the Logger to be used
*/
protected $mongoLogger;

/**
* @param string $name
*/
public function setName($name)
{
$this->name = (string) $name;
}

/**
* Name of the collector
*
* @return string
*/
public function getName()
{
return $this->name;
}

/**
* @param string|null $configuration
*/
public function setConfiguration($configuration)
{
$this->configuration = $configuration ? (string) $configuration : null;
}

/**
* Configuration service name (where to set the logger)
*
* @return string
*/
public function getConfiguration()
{
return $this->configuration ? $this->configuration : 'doctrine.configuration.odm_default';
}

/**
* @param string|null $mongoLogger
*/
public function setMongoLogger($mongoLogger)
{
$this->mongoLogger = $mongoLogger ? (string) $mongoLogger : null;
}

/**
* Logger service name
*
* @return string|null
*/
public function getMongoLogger()
{
return $this->mongoLogger;
}
}
89 changes: 89 additions & 0 deletions src/DoctrineMongoODMModule/Service/MongoLoggerCollectorFactory.php
@@ -0,0 +1,89 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/

namespace DoctrineMongoODMModule\Service;

use DoctrineModule\Service\AbstractFactory;

use Zend\ServiceManager\ServiceLocatorInterface;

use DoctrineMongoODMModule\Collector\MongoLoggerCollector;

use DoctrineMongoODMModule\Logging\DebugStack;
use DoctrineMongoODMModule\Logging\LoggerChain;

/**
* Mongo Logger Configuration ServiceManager factory
*
* @license MIT
* @link http://www.doctrine-project.org/
*/
class MongoLoggerCollectorFactory extends AbstractFactory
{
/**
* @var string
*/
protected $name;

/**
* @param $name
*/
public function __construct($name)
{
$this->name = $name;
}

/**
* {@inheritDoc}
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
/** @var $options \DoctrineMongoODMModule\Options\MongoLoggerCollector */
$options = $this->getOptions($serviceLocator, 'mongo_logger_collector');

if ($options->getMongoLogger()) {
$debugStackLogger = $serviceLocator->get($options->getMongoLogger());
} else {
$debugStackLogger = new DebugStack();
}

/** @var $options \Doctrine\ODM\MongoDB\Configuration */
$configuration = $serviceLocator->get($options->getConfiguration());

if (null !== $configuration->getLoggerCallable()) {
$logger = new LoggerChain();
$logger->addLogger($debugStackLogger);
$callable = $configuration->getLoggerCallable();
$logger->addLogger($callable[0]);
$configuration->setLoggerCallable(array($logger, 'log'));
} else {
$configuration->setLoggerCallable(array($debugStackLogger, 'log'));
}

return new MongoLoggerCollector($debugStackLogger, $options->getName());
}

/**
* {@inheritDoc}
*/
public function getOptionsClass()
{
return 'DoctrineMongoODMModule\Options\MongoLoggerCollector';
}
}

0 comments on commit 983c198

Please sign in to comment.