From 49bcc69f3a15c7dc153b4a99884d1a31245ad9e3 Mon Sep 17 00:00:00 2001 From: guilhermeblanco Date: Fri, 30 Oct 2009 00:15:53 +0000 Subject: [PATCH] [2.0] Moved EntityManager creation to be always available in CLI Tasks --- .../ORM/Mapping/Driver/AbstractFileDriver.php | 7 +-- lib/Doctrine/ORM/Tools/Cli.php | 44 ++++++++++++++- .../ORM/Tools/Cli/Tasks/AbstractTask.php | 54 +++++++++---------- .../ORM/Tools/Cli/Tasks/ClearCacheTask.php | 2 +- .../Tools/Cli/Tasks/ConvertMappingTask.php | 5 +- .../Tasks/EnsureProductionSettingsTask.php | 7 ++- .../Tools/Cli/Tasks/GenerateProxiesTask.php | 20 +++---- lib/Doctrine/ORM/Tools/Cli/Tasks/HelpTask.php | 1 + .../ORM/Tools/Cli/Tasks/RunDqlTask.php | 2 +- .../ORM/Tools/Cli/Tasks/RunSqlTask.php | 6 ++- .../ORM/Tools/Cli/Tasks/SchemaToolTask.php | 16 +++--- .../ORM/Tools/Cli/Tasks/VersionTask.php | 2 +- tools/sandbox/cli-config.php | 4 +- 13 files changed, 109 insertions(+), 61 deletions(-) diff --git a/lib/Doctrine/ORM/Mapping/Driver/AbstractFileDriver.php b/lib/Doctrine/ORM/Mapping/Driver/AbstractFileDriver.php index abefd6038..c6040a6c4 100644 --- a/lib/Doctrine/ORM/Mapping/Driver/AbstractFileDriver.php +++ b/lib/Doctrine/ORM/Mapping/Driver/AbstractFileDriver.php @@ -40,6 +40,7 @@ abstract class AbstractFileDriver implements Driver * adhere to the convention of 1 mapping file per class and the file names of * the mapping files must correspond to the full class name, including namespace, * with the namespace delimiters '\', replaced by dots '.'. + * This is the default behavior. * * Example: * Class: My\Project\Model\User @@ -51,8 +52,8 @@ abstract class AbstractFileDriver implements Driver /** * The PRELOAD mode is an operating mode of the FileDriver where it loads - * all mapping files in advance. This is the default behavior. It does not - * require a naming convention or the convention of 1 class per mapping file. + * all mapping files in advance. It does not require a naming convention + * or the convention of 1 class per mapping file. * * @var integer */ @@ -95,7 +96,7 @@ abstract class AbstractFileDriver implements Driver */ public function __construct($paths, $mode = self::FILE_PER_CLASS) { - $this->_paths = $paths; + $this->_paths = (array) $paths; $this->_mode = $mode; } diff --git a/lib/Doctrine/ORM/Tools/Cli.php b/lib/Doctrine/ORM/Tools/Cli.php index 07055a7e8..b62eac970 100644 --- a/lib/Doctrine/ORM/Tools/Cli.php +++ b/lib/Doctrine/ORM/Tools/Cli.php @@ -157,7 +157,7 @@ class Cli try { $this->_printer->writeln('Doctrine Command Line Interface' . PHP_EOL, 'HEADER'); - + // Handle possible multiple tasks on a single command foreach($processedArgs as $taskData) { // Retrieve the task name and arguments @@ -166,9 +166,13 @@ class Cli // Check if task exists if (isset($this->_tasks[$taskName]) && class_exists($this->_tasks[$taskName], true)) { + // Initializing EntityManager + $em = $this->_initializeEntityManager($processedArgs); + // Instantiate and execute the task $task = new $this->_tasks[$taskName](); $task->setAvailableTasks($this->_tasks); + $task->setEntityManager($em); $task->setPrinter($this->_printer); $task->setArguments($taskArguments); @@ -311,4 +315,42 @@ class Cli // required and optional arguments here? return $task->validate(); } + + /** + * Initialized Entity Manager for Tasks + * + * @param array CLI Task arguments + * @return EntityManager + */ + private function _initializeEntityManager(& $args) + { + // Initialize EntityManager + $configFile = ( ! isset($args['config'])) ? './cli-config.php' : $args['config']; + + if (file_exists($configFile)) { + // Including configuration file + require $configFile; + + // Check existance of EntityManager + if ( ! isset($em)) { + throw new \Doctrine\Common\DoctrineException( + 'No EntityManager created in configuration' + ); + } + + // Check for gloal argument options here + if (isset($globalArguments)) { + // Merge arguments. Values specified via the CLI take preference. + $args = array_merge($globalArguments, $args); + } + + return $em; + } else { + throw new \Doctrine\Common\DoctrineException( + 'Requested configuration file [' . $configFile . '] does not exist' + ); + } + + return null; + } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/AbstractTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/AbstractTask.php index 9e0413ad4..4f6f51f02 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/AbstractTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/AbstractTask.php @@ -60,6 +60,9 @@ abstract class AbstractTask */ protected $_availableTasks; + /** + * @var EntityManager The EntityManager instance + */ protected $_em; /** @@ -122,6 +125,26 @@ abstract class AbstractTask return $this->_availableTasks; } + /** + * Defines the EntityManager + * + * @param EntityManager The EntityManager instance + */ + public function setEntityManager($em) + { + $this->_em = $em; + } + + /** + * Retrieves current EntityManager + * + * @return EntityManager + */ + public function getEntityManager() + { + return $this->_em; + } + /** * Expose to CLI Output Printer the extended help of the given task. * This means it should detail all parameters, options and the meaning @@ -159,27 +182,7 @@ abstract class AbstractTask * * @return boolean */ - public function validate() - { - if ( ! isset($this->_arguments['config'])) { - if (file_exists('./cli-config.php')) { - require './cli-config.php'; - } - } else { - require $this->_arguments['config']; - } - - // $em and $args come from the config - if (isset($em)) { - $this->_em = $em; - } - if (isset($args)) { - // Merge arguments. Values specified via the CLI take preference. - $this->_arguments = array_merge($args, $this->_arguments); - } - - return true; - } + abstract public function validate(); /** * Safely execution of task. @@ -187,13 +190,4 @@ abstract class AbstractTask * what is supposed to do. */ abstract public function run(); - - protected function _requireEntityManager() - { - if ( ! isset($this->_em)) { - $this->_printer->writeln('No EntityManager created in configuration but required by task ' . get_class($this), 'ERROR'); - return false; - } - return true; - } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/ClearCacheTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/ClearCacheTask.php index ad62ee36c..106f88bd2 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/ClearCacheTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/ClearCacheTask.php @@ -120,7 +120,7 @@ class ClearCacheTask extends AbstractTask $all = true; } - $configuration = $this->_em->getConfiguration(); + $configuration = $this->getEntityManager()->getConfiguration(); if ($query || $all) { $this->_doDelete( diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php index 174e38ac2..da556798c 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/ConvertMappingTask.php @@ -111,8 +111,9 @@ class ConvertMappingTask extends AbstractTask return false; } if ($args['from'][0] == 'database') { - $config = $this->_em->getConfiguration(); - $config->setMetadataDriverImpl(new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($this->_em->getConnection()->getSchemaManager())); + $em = $this->getEntityManager(); + $config = $em->getConfiguration(); + $config->setMetadataDriverImpl(new \Doctrine\ORM\Mapping\Driver\DatabaseDriver($em->getConnection()->getSchemaManager())); } return true; } diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/EnsureProductionSettingsTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/EnsureProductionSettingsTask.php index eefacca18..939777922 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/EnsureProductionSettingsTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/EnsureProductionSettingsTask.php @@ -56,12 +56,17 @@ class EnsureProductionSettingsTask extends AbstractTask { $printer->writeln('ensure-production-settings', 'KEYWORD'); } + + public function validate() + { + return true; + } public function run() { $printer = $this->getPrinter(); try { - $this->_em->getConfiguration()->ensureProductionSettings(); + $this->getEntityManager()->getConfiguration()->ensureProductionSettings(); } catch (\Doctrine\Common\DoctrineException $e) { $printer->writeln($e->getMessage(), 'ERROR'); } diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/GenerateProxiesTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/GenerateProxiesTask.php index a19e35ebb..d36a2f15a 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/GenerateProxiesTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/GenerateProxiesTask.php @@ -59,11 +59,8 @@ class GenerateProxiesTask extends AbstractTask $args = $this->getArguments(); $printer = $this->getPrinter(); - if ( ! $this->_requireEntityManager()) { - return false; - } + $metadataDriver = $this->getEntityManager()->getConfiguration()->getMetadataDriverImpl(); - $metadataDriver = $this->_em->getConfiguration()->getMetadataDriverImpl(); if ($metadataDriver instanceof \Doctrine\ORM\Mapping\Driver\AnnotationDriver) { if ( ! isset($args['class-dir'])) { $printer->writeln("The supplied configuration uses the annotation metadata driver." @@ -84,17 +81,19 @@ class GenerateProxiesTask extends AbstractTask { $args = $this->getArguments(); - $cmf = $this->_em->getMetadataFactory(); - $driver = $this->_em->getConfiguration()->getMetadataDriverImpl(); + $em = $this->getEntityManager(); + $cmf = $em->getMetadataFactory(); + $driver = $em->getConfiguration()->getMetadataDriverImpl(); $classes = array(); $preloadedClasses = $driver->preload(true); + foreach ($preloadedClasses as $className) { $classes[] = $cmf->getMetadataFor($className); } $printer = $this->getPrinter(); - $factory = $this->_em->getProxyFactory(); + $factory = $em->getProxyFactory(); if (empty($classes)) { $printer->writeln('No classes to process.', 'INFO'); @@ -103,8 +102,9 @@ class GenerateProxiesTask extends AbstractTask $factory->generateProxyClasses($classes, isset($args['to-dir']) ? $args['to-dir'] : null); - $printer->writeln('Proxy classes generated to: ' . - (isset($args['to-dir']) ? $args['to-dir'] : $this->_em->getConfiguration()->getProxyDir()) - ); + $printer->writeln( + 'Proxy classes generated to: ' . + (isset($args['to-dir']) ? $args['to-dir'] : $em->getConfiguration()->getProxyDir()) + ); } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/HelpTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/HelpTask.php index b25195fff..7fb090b72 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/HelpTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/HelpTask.php @@ -80,6 +80,7 @@ class HelpTask extends AbstractTask $task = new $taskClass(); $task->setAvailableTasks($availableTasks); + $task->setEntityManager($this->getEntityManager()); $task->setPrinter($this->getPrinter()); $task->setArguments($this->getArguments()); diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/RunDqlTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/RunDqlTask.php index 9857d233f..b39b9037e 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/RunDqlTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/RunDqlTask.php @@ -101,7 +101,7 @@ class RunDqlTask extends AbstractTask $args = $this->getArguments(); try { - $query = $this->_em->createQuery($args['dql']); + $query = $this->getEntityManager()->createQuery($args['dql']); $resultSet = $query->getResult(); $maxDepth = isset($args['depth']) ? $args['depth'] : 7; diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/RunSqlTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/RunSqlTask.php index 6a13d185f..5dd511772 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/RunSqlTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/RunSqlTask.php @@ -113,11 +113,13 @@ class RunSqlTask extends AbstractTask if (isset($args['file'])) { //TODO } else if (isset($args['sql'])) { + $conn = $this->getEntityManager()->getConnection(); + if (preg_match('/^select/i', $args['sql'])) { - $stmt = $this->_em->getConnection()->execute($args['sql']); + $stmt = $conn->execute($args['sql']); $resultSet = $stmt->fetchAll(\Doctrine\DBAL\Connection::FETCH_ASSOC); } else { - $resultSet = $this->_em->getConnection()->executeUpdate($args['sql']); + $resultSet = $conn->executeUpdate($args['sql']); } $maxDepth = isset($args['depth']) ? $args['depth'] : 7; diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/SchemaToolTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/SchemaToolTask.php index 7ca1d7040..46404f1ee 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/SchemaToolTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/SchemaToolTask.php @@ -106,10 +106,6 @@ class SchemaToolTask extends AbstractTask $args = $this->getArguments(); $printer = $this->getPrinter(); - if ( ! $this->_requireEntityManager()) { - return false; - } - if (array_key_exists('re-create', $args)) { $args['drop'] = true; $args['create'] = true; @@ -130,7 +126,8 @@ class SchemaToolTask extends AbstractTask return false; } - $metadataDriver = $this->_em->getConfiguration()->getMetadataDriverImpl(); + $metadataDriver = $this->getEntityManager()->getConfiguration()->getMetadataDriverImpl(); + if ($metadataDriver instanceof \Doctrine\ORM\Mapping\Driver\AnnotationDriver) { if ( ! isset($args['class-dir'])) { $printer->writeln("The supplied configuration uses the annotation metadata driver." @@ -155,23 +152,26 @@ class SchemaToolTask extends AbstractTask $isDrop = isset($args['drop']); $isUpdate = isset($args['update']); - $cmf = $this->_em->getMetadataFactory(); - $driver = $this->_em->getConfiguration()->getMetadataDriverImpl(); + $em = $this->getEntityManager(); + $cmf = $em->getMetadataFactory(); + $driver = $em->getConfiguration()->getMetadataDriverImpl(); $classes = array(); $preloadedClasses = $driver->preload(true); + foreach ($preloadedClasses as $className) { $classes[] = $cmf->getMetadataFor($className); } $printer = $this->getPrinter(); - $tool = new SchemaTool($this->_em); if (empty($classes)) { $printer->writeln('No classes to process.', 'INFO'); return; } + $tool = new SchemaTool($em); + if ($isDrop) { if (isset($args['dump-sql'])) { foreach ($tool->getDropSchemaSql($classes) as $sql) { diff --git a/lib/Doctrine/ORM/Tools/Cli/Tasks/VersionTask.php b/lib/Doctrine/ORM/Tools/Cli/Tasks/VersionTask.php index af46b8d1e..dba298ee9 100644 --- a/lib/Doctrine/ORM/Tools/Cli/Tasks/VersionTask.php +++ b/lib/Doctrine/ORM/Tools/Cli/Tasks/VersionTask.php @@ -77,6 +77,6 @@ class VersionTask extends AbstractTask */ public function run() { - $this->getPrinter()->writeln('You are currently running Doctrine 2.0.0 Alpha 1', 'INFO'); + $this->getPrinter()->writeln('You are currently running Doctrine 2.0.0 Alpha 3', 'INFO'); } } \ No newline at end of file diff --git a/tools/sandbox/cli-config.php b/tools/sandbox/cli-config.php index 3eb2fd262..3a5303619 100644 --- a/tools/sandbox/cli-config.php +++ b/tools/sandbox/cli-config.php @@ -33,7 +33,9 @@ $connectionOptions = array( 'path' => 'database.sqlite' ); +// These are required named variables (names can't change!) $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config); -$args = array( + +$globalArguments = array( 'class-dir' => './Entities' ); \ No newline at end of file