1
0
mirror of synced 2024-12-14 15:16:04 +03:00

Merge branch 'GenerationTools'

This commit is contained in:
Benjamin Eberlei 2011-01-23 20:26:37 +01:00
commit 8869678c0f
5 changed files with 61 additions and 6 deletions

View File

@ -63,6 +63,10 @@ class ConvertMappingCommand extends Console\Command\Command
'dest-path', InputArgument::REQUIRED, 'dest-path', InputArgument::REQUIRED,
'The path to generate your entities classes.' 'The path to generate your entities classes.'
), ),
new InputOption(
'force', null, InputOption::VALUE_NONE,
'Force to overwrite existing mapping files.'
),
new InputOption( new InputOption(
'from-database', null, null, 'Whether or not to convert mapping information from existing database.' 'from-database', null, null, 'Whether or not to convert mapping information from existing database.'
), ),
@ -73,10 +77,24 @@ class ConvertMappingCommand extends Console\Command\Command
new InputOption( new InputOption(
'num-spaces', null, InputOption::VALUE_OPTIONAL, 'num-spaces', null, InputOption::VALUE_OPTIONAL,
'Defines the number of indentation spaces', 4 'Defines the number of indentation spaces', 4
) ),
)) ))
->setHelp(<<<EOT ->setHelp(<<<EOT
Convert mapping information between supported formats. Convert mapping information between supported formats.
This is an execute <info>one-time</info> command. It should not be necessary for
you to call this method multiple times, escpecially when using the <comment>--from-database</comment>
flag.
Converting an existing databsae schema into mapping files only solves about 70-80%
of the necessary mapping information. Additionally the detection from an existing
database cannot detect inverse associations, inheritance types,
entities with foreign keys as primary keys and many of the
semantical operations on associations such as cascade.
<comment>Hint:</comment> There is no need to convert YAML or XML mapping files to annotations
every time you make changes. All mapping drivers are first class citizens
in Doctrine 2 and can be used as runtime mapping for the ORM.
EOT EOT
); );
} }
@ -121,6 +139,7 @@ EOT
$cme = new ClassMetadataExporter(); $cme = new ClassMetadataExporter();
$exporter = $cme->getExporter($toType, $destPath); $exporter = $cme->getExporter($toType, $destPath);
$exporter->setOverwriteExistingFiles( ($input->getOption('force') !== false) );
if ($toType == 'annotation') { if ($toType == 'annotation') {
$entityGenerator = new EntityGenerator(); $entityGenerator = new EntityGenerator();

View File

@ -85,6 +85,23 @@ class GenerateEntitiesCommand extends Console\Command\Command
)) ))
->setHelp(<<<EOT ->setHelp(<<<EOT
Generate entity classes and method stubs from your mapping information. Generate entity classes and method stubs from your mapping information.
If you use the <comment>--update-entities</comment> or <comment>--regenerate-entities</comment> flags your exisiting
code gets overwritten. The EntityGenerator will only append new code to your
file and will not delete the old code. However this approach may still be prone
to error and we suggest you use code repositories such as GIT or SVN to make
backups of your code.
It makes sense to generate the entity code if you are using entities as Data
Access Objects only and dont put much additional logic on them. If you are
however putting much more logic on the entities you should refrain from using
the entity-generator and code your entities manually.
<error>Important:</error> Even if you specified Inheritance options in your
XML or YAML Mapping files the generator cannot generate the base and
child classes for you correctly, because it doesn't know which
class is supposed to extend which. You have to adjust the entity
code manually for inheritance to work!
EOT EOT
); );
} }

View File

@ -23,6 +23,7 @@
namespace Doctrine\ORM\Tools\Export\Driver; namespace Doctrine\ORM\Tools\Export\Driver;
use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Mapping\ClassMetadataInfo;
use Doctrine\ORM\Tools\Export\ExportException;
/** /**
* Abstract base class which is to be used for the Exporter drivers * Abstract base class which is to be used for the Exporter drivers
@ -39,12 +40,18 @@ abstract class AbstractExporter
protected $_metadata = array(); protected $_metadata = array();
protected $_outputDir; protected $_outputDir;
protected $_extension; protected $_extension;
protected $_overwriteExistingFiles = false;
public function __construct($dir = null) public function __construct($dir = null)
{ {
$this->_outputDir = $dir; $this->_outputDir = $dir;
} }
public function setOverwriteExistingFiles($overwrite)
{
$this->_overwriteExistingFiles = $overwrite;
}
/** /**
* Converts a single ClassMetadata instance to the exported format * Converts a single ClassMetadata instance to the exported format
* and returns it * and returns it
@ -110,6 +117,9 @@ abstract class AbstractExporter
if ( ! is_dir($dir)) { if ( ! is_dir($dir)) {
mkdir($dir, 0777, true); mkdir($dir, 0777, true);
} }
if (file_exists($path) && !$this->_overwriteExistingFiles) {
throw ExportException::attemptOverwriteExistingFile($path);
}
file_put_contents($path, $output); file_put_contents($path, $output);
} }
} }

View File

@ -15,4 +15,9 @@ class ExportException extends ORMException
{ {
return new self("The mapping driver '$type' does not exist"); return new self("The mapping driver '$type' does not exist");
} }
public static function attemptOverwriteExistingFile($file)
{
return new self("Attempting to overwrite an existing file '".$file."'.");
}
} }

View File

@ -69,6 +69,7 @@ class ConvertDoctrine1SchemaTest extends \Doctrine\Tests\OrmTestCase
$converter = new ConvertDoctrine1Schema(__DIR__ . '/doctrine1schema'); $converter = new ConvertDoctrine1Schema(__DIR__ . '/doctrine1schema');
$exporter = $cme->getExporter('yml', __DIR__ . '/convert'); $exporter = $cme->getExporter('yml', __DIR__ . '/convert');
$exporter->setOverwriteExistingFiles(true);
$exporter->setMetadata($converter->getMetadata()); $exporter->setMetadata($converter->getMetadata());
$exporter->export(); $exporter->export();
@ -80,8 +81,8 @@ class ConvertDoctrine1SchemaTest extends \Doctrine\Tests\OrmTestCase
$cmf = new DisconnectedClassMetadataFactory(); $cmf = new DisconnectedClassMetadataFactory();
$cmf->setEntityManager($em); $cmf->setEntityManager($em);
$metadata = $cmf->getAllMetadata(); $metadata = $cmf->getAllMetadata();
$profileClass = $metadata[0]; $profileClass = $cmf->getMetadataFor('Profile');
$userClass = $metadata[1]; $userClass = $cmf->getMetadataFor('User');
$this->assertEquals(2, count($metadata)); $this->assertEquals(2, count($metadata));
$this->assertEquals('Profile', $profileClass->name); $this->assertEquals('Profile', $profileClass->name);
@ -96,9 +97,12 @@ class ConvertDoctrine1SchemaTest extends \Doctrine\Tests\OrmTestCase
$this->assertEquals('User', $profileClass->associationMappings['User']['targetEntity']); $this->assertEquals('User', $profileClass->associationMappings['User']['targetEntity']);
$this->assertEquals('username', $userClass->table['uniqueConstraints']['username']['columns'][0]); $this->assertEquals('username', $userClass->table['uniqueConstraints']['username']['columns'][0]);
}
unlink(__DIR__ . '/convert/User.dcm.yml'); public function tearDown()
unlink(__DIR__ . '/convert/Profile.dcm.yml'); {
rmdir(__DIR__ . '/convert'); @unlink(__DIR__ . '/convert/User.dcm.yml');
@unlink(__DIR__ . '/convert/Profile.dcm.yml');
@rmdir(__DIR__ . '/convert');
} }
} }