diff --git a/config/module.config.php b/config/module.config.php index 4bf4daf..a2820f0 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -54,6 +54,10 @@ ) ), + 'mongo_logger_collector' => array( + 'odm_default' => array(), + ), + 'authentication' => array( 'odm_default' => array( 'objectManager' => 'doctrine.documentmanager.odm_default', @@ -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', + ), + ), + ), ); \ No newline at end of file diff --git a/src/DoctrineMongoODMModule/Collector/MongoLoggerCollector.php b/src/DoctrineMongoODMModule/Collector/MongoLoggerCollector.php new file mode 100644 index 0000000..d46a45c --- /dev/null +++ b/src/DoctrineMongoODMModule/Collector/MongoLoggerCollector.php @@ -0,0 +1,117 @@ +. + */ +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; + } +} diff --git a/src/DoctrineMongoODMModule/Module.php b/src/DoctrineMongoODMModule/Module.php index 15c7452..ff051f1 100644 --- a/src/DoctrineMongoODMModule/Module.php +++ b/src/DoctrineMongoODMModule/Module.php @@ -50,6 +50,14 @@ public function onBootstrap(EventInterface $event) // Attach to helper set event and load the document manager helper. $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'); + } } /** @@ -119,6 +127,7 @@ public function getServiceConfig() 'doctrine.driver.odm_default' => new CommonService\DriverFactory('odm_default'), 'doctrine.documentmanager.odm_default' => new ODMService\DocumentManagerFactory('odm_default'), 'doctrine.eventmanager.odm_default' => new CommonService\EventManagerFactory('odm_default'), + 'doctrine.mongo_logger_collector.odm_default' => new ODMService\MongoLoggerCollectorFactory('odm_default'), ) ); } diff --git a/src/DoctrineMongoODMModule/Options/MongoLoggerCollector.php b/src/DoctrineMongoODMModule/Options/MongoLoggerCollector.php new file mode 100644 index 0000000..5f5e1f3 --- /dev/null +++ b/src/DoctrineMongoODMModule/Options/MongoLoggerCollector.php @@ -0,0 +1,100 @@ +. + */ + +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; + } +} diff --git a/src/DoctrineMongoODMModule/Service/MongoLoggerCollectorFactory.php b/src/DoctrineMongoODMModule/Service/MongoLoggerCollectorFactory.php new file mode 100644 index 0000000..7e26e48 --- /dev/null +++ b/src/DoctrineMongoODMModule/Service/MongoLoggerCollectorFactory.php @@ -0,0 +1,89 @@ +. + */ + +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'; + } +} diff --git a/view/zend-developer-tools/toolbar/doctrine-odm.phtml b/view/zend-developer-tools/toolbar/doctrine-odm.phtml new file mode 100644 index 0000000..e7333a7 --- /dev/null +++ b/view/zend-developer-tools/toolbar/doctrine-odm.phtml @@ -0,0 +1,206 @@ +
+
+ Database (Zend\Db) + + collector->getQueryCount(); ?> queries + +
+
+ Details + + Help us! + + Please help us improve +
+ profiling by forking and +
+ contributing to +
+ + DoctrineMongoODMModule + +
+
+ + Queries + + collector->getQueries() as $query): ?> +
+ + + Database + + + + + + + + Collection + + + + + + + Query + + + + $value): ?> + + + + + + + + + Fields + + $value): ?> +      => + + + + + + + Find + + + + + + + + Limit to + + + + + + + + Sort by + + + + + + + + Skip to + + + + + + + + Authenticate + +     username =>
+     password => +
+ + + + + Command + +     data =>
+     options => +
+ + + + + Create collection + +     capped =>
+     size =>
+     max => +
+ + + + + Create DB ref + +     collection =>
+     reference => +
+ + + + + Get DB ref + +     reference => + + + + + + Drop database + +     dropDatabase => + + + + + + Code + + + + + Args + + $value): ?> +      =>
+ +
+ + + +
+
+
+