[DoctrineBundle] More cleanups of doctrine commands.
This commit is contained in:
parent
bdbfb44a96
commit
5014ee9739
@ -49,7 +49,7 @@ EOT
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$connection = $this->getDoctrineConnection($intput->getOption('connection'));
|
||||
$connection = $this->getDoctrineConnection($input->getOption('connection'));
|
||||
|
||||
$params = $connection->getParams();
|
||||
$name = isset($params['path']) ? $params['path']:$params['dbname'];
|
||||
|
@ -134,4 +134,40 @@ abstract class DoctrineCommand extends Command
|
||||
|
||||
return $bundleMetadatas;
|
||||
}
|
||||
|
||||
protected function findBundle($bundleName)
|
||||
{
|
||||
$foundBundle = false;
|
||||
foreach ($this->application->getKernel()->getBundles() as $bundle) {
|
||||
/* @var $bundle Bundle */
|
||||
if (strtolower($bundleName) == strtolower($bundle->getName())) {
|
||||
$foundBundle = $bundle;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$foundBundle) {
|
||||
throw new \InvalidArgumentException("No bundle " . $bundleName . " was found.");
|
||||
}
|
||||
|
||||
return $foundBundle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform classname to a path $foundBundle substract it to get the destination
|
||||
*
|
||||
* @param Bundle $bundle
|
||||
* @return string
|
||||
*/
|
||||
protected function findBasePathForBundle($bundle)
|
||||
{
|
||||
$path = str_replace('\\', '/', $bundle->getNamespace());
|
||||
$destination = str_replace('/'.$path, "", $bundle->getPath(), $c);
|
||||
|
||||
if ($c != 1) {
|
||||
throw new \RuntimeException("Something went terribly wrong.");
|
||||
}
|
||||
|
||||
return $destination;
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ EOT
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$connection = $this->getDoctrineConnection($intput->getOption('connection'));
|
||||
$connection = $this->getDoctrineConnection($input->getOption('connection'));
|
||||
|
||||
$params = $connection->getParams();
|
||||
|
||||
|
@ -16,8 +16,6 @@ use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Output\Output;
|
||||
use Symfony\Component\HttpKernel\Bundle\Bundle;
|
||||
use Doctrine\ORM\Tools\EntityGenerator;
|
||||
|
||||
/**
|
||||
* Generate entity classes from mapping information
|
||||
@ -32,7 +30,7 @@ class GenerateEntitiesDoctrineCommand extends DoctrineCommand
|
||||
$this
|
||||
->setName('doctrine:generate:entities')
|
||||
->setDescription('Generate entity classes and method stubs from your mapping information.')
|
||||
->addOption('bundle', null, InputOption::VALUE_REQUIRED, 'The bundle to initialize the entity or entities in.')
|
||||
->addArgument('bundle', InputArgument::REQUIRED, 'The bundle to initialize the entity or entities in.')
|
||||
->addOption('entity', null, InputOption::VALUE_OPTIONAL, 'The entity class to initialize (shortname without namespace).')
|
||||
->setHelp(<<<EOT
|
||||
The <info>doctrine:generate:entities</info> command generates entity classes and method stubs from your mapping information:
|
||||
@ -52,30 +50,31 @@ EOT
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$bundleName = $input->getArgument('bundle');
|
||||
$filterEntity = $input->getOption('entity');
|
||||
|
||||
$foundBundle = $this->findBundle($bundleName);
|
||||
|
||||
if ($metadatas = $this->getBundleMetadatas($foundBundle)) {
|
||||
$output->writeln(sprintf('Generating entities for "<info>%s</info>"', $foundBundle->getName()));
|
||||
$entityGenerator = $this->getEntityGenerator();
|
||||
foreach ($this->application->getKernel()->getBundles() as $bundle) {
|
||||
/* @var $bundle Bundle */
|
||||
if ($input->getOption('bundle') != $bundle->getName()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// transform classname to a path and substract it to get the destination
|
||||
$path = dirname(str_replace('\\', '/', $bundle->getNamespace()));
|
||||
$destination = str_replace('/'.$path, "", $bundle->getPath());
|
||||
|
||||
if ($metadatas = $this->getBundleMetadatas($bundle)) {
|
||||
$output->writeln(sprintf('Generating entities for "<info>%s</info>"', $class));
|
||||
|
||||
foreach ($metadatas as $metadata) {
|
||||
if ($filterEntity && $metadata->reflClass->getShortName() == $filterEntity) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strpos($metadata->name, $foundBundle->getNamespace()) === false) {
|
||||
throw new \RuntimeException(
|
||||
"Entity " . $metadata->name . " and bundle don't have a commont namespace, ".
|
||||
"generation failed because the target directory cannot be detected.");
|
||||
}
|
||||
|
||||
$output->writeln(sprintf(' > generating <comment>%s</comment>', $metadata->name));
|
||||
$entityGenerator->generate(array($metadata), $destination);
|
||||
}
|
||||
$entityGenerator->generate(array($metadata), $this->findBasePathForBundle($foundBundle));
|
||||
}
|
||||
} else {
|
||||
throw new \RuntimeException("Bundle " . $bundleName . " does not contain any mapped entities.");
|
||||
}
|
||||
}
|
||||
}
|
@ -73,6 +73,7 @@ EOT
|
||||
foreach ($e as $value) {
|
||||
$e = explode(':', $value);
|
||||
$name = $e[0];
|
||||
if (strlen($name)) {
|
||||
$type = isset($e[1]) ? $e[1] : 'string';
|
||||
preg_match_all('/(.*)\((.*)\)/', $type, $matches);
|
||||
$type = isset($matches[1][0]) ? $matches[1][0] : $type;
|
||||
@ -84,27 +85,50 @@ EOT
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Setup a new exporter for the mapping type specified
|
||||
$cme = new ClassMetadataExporter();
|
||||
$exporter = $cme->getExporter($mappingType);
|
||||
|
||||
$entityPath = $bundle->getPath().'/Entity/'.$entity.'.php';
|
||||
if (file_exists($entityPath)) {
|
||||
throw new \RuntimeException(sprintf("Entity %s already exists.", $class->name));
|
||||
}
|
||||
|
||||
if ('annotation' === $mappingType) {
|
||||
$path = $bundle->getPath().'/Entity/'.$entity.'.php';
|
||||
$exporter->setEntityGenerator($this->getEntityGenerator());
|
||||
$entityCode = $exporter->exportClassMetadata($class);
|
||||
$mappingPath = $mappingCode = false;
|
||||
} else {
|
||||
$mappingType = 'yaml' == $mappingType ? 'yml' : $mappingType;
|
||||
$path = $bundle->getPath().'/Resources/config/doctrine/metadata/orm/'.str_replace('\\', '.', $fullEntityClassName).'.dcm.'.$mappingType;
|
||||
}
|
||||
$mappingPath = $bundle->getPath().'/Resources/config/doctrine/metadata/orm/'.str_replace('\\', '.', $fullEntityClassName).'.dcm.'.$mappingType;
|
||||
$mappingCode = $exporter->exportClassMetadata($class);
|
||||
|
||||
$code = $exporter->exportClassMetadata($class);
|
||||
$entityGenerator = $this->getEntityGenerator();
|
||||
$entityCode = $entityGenerator->generateEntityClass($class);
|
||||
|
||||
if (file_exists($mappingPath)) {
|
||||
throw new \RuntimeException(sprintf("Cannot generate entity when mapping <info>%s</info> already exists", $mappingPath));
|
||||
}
|
||||
}
|
||||
|
||||
$output->writeln(sprintf('Generating entity for "<info>%s</info>"', $bundle->getName()));
|
||||
$output->writeln(sprintf(' > generating <comment>%s</comment>', $fullEntityClassName));
|
||||
$output->writeln(sprintf(' > entity <comment>%s</comment> into <info>%s</info>', $fullEntityClassName, $entityPath));
|
||||
|
||||
if (!is_dir($dir = dirname($path))) {
|
||||
if (!is_dir($dir = dirname($entityPath))) {
|
||||
mkdir($dir, 0777, true);
|
||||
}
|
||||
file_put_contents($path, $code);
|
||||
file_put_contents($entityPath, $entityCode);
|
||||
|
||||
if ($mappingPath) {
|
||||
$output->writeln(sprintf(' > mapping into <info>%s</info>', $mappingPath));
|
||||
|
||||
if (!is_dir($dir = dirname($mappingPath))) {
|
||||
mkdir($dir, 0777, true);
|
||||
}
|
||||
file_put_contents($mappingPath, $mappingCode);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -11,9 +11,11 @@
|
||||
|
||||
namespace Symfony\Bundle\DoctrineBundle\Command;
|
||||
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputOption;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Output\Output;
|
||||
use Doctrine\ORM\Tools\EntityRepositoryGenerator;
|
||||
|
||||
/**
|
||||
@ -29,6 +31,8 @@ class GenerateRepositoriesDoctrineCommand extends DoctrineCommand
|
||||
$this
|
||||
->setName('doctrine:generate:repositories')
|
||||
->setDescription('Generate repository classes from your mapping information.')
|
||||
->addArgument('bundle', InputArgument::REQUIRED, 'The bundle to initialize the repositories in.')
|
||||
->addOption('entity', null, InputOption::VALUE_OPTIONAL, 'The entity class to generate the repository for (shortname without namespace).')
|
||||
->setHelp(<<<EOT
|
||||
The <info>doctrine:generate:repositories</info> command generates the configured entity repository classes from your mapping information:
|
||||
|
||||
@ -39,18 +43,35 @@ EOT
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$bundleName = $input->getArgument('bundle');
|
||||
$filterEntity = $input->getOption('entity');
|
||||
|
||||
$foundBundle = $this->findBundle($bundleName);
|
||||
|
||||
if ($metadatas = $this->getBundleMetadatas($foundBundle)) {
|
||||
$output->writeln(sprintf('Generating entity repositories for "<info>%s</info>"', $foundBundle->getName()));
|
||||
$generator = new EntityRepositoryGenerator();
|
||||
foreach ($this->application->getKernel()->getBundles() as $bundle) {
|
||||
$destination = $bundle->getPath();
|
||||
if ($metadatas = $this->getBundleMetadatas($bundle)) {
|
||||
$output->writeln(sprintf('Generating entity repositories for "<info>%s</info>"', get_class($bundle)));
|
||||
|
||||
foreach ($metadatas as $metadata) {
|
||||
if ($filterEntity && $filterEntity !== $metadata->reflClass->getShortname()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($metadata->customRepositoryClassName) {
|
||||
$output->writeln(sprintf(' > generating <comment>%s</comment>', $metadata->customRepositoryClassName));
|
||||
$generator->writeEntityRepositoryClass($metadata->customRepositoryClassName, $destination);
|
||||
}
|
||||
if (strpos($metadata->customRepositoryClassName, $foundBundle->getName()) === false) {
|
||||
throw new \RuntimeException(
|
||||
"Repository " . $metadata->customRepositoryClassName . " and bundle don't have a commont namespace, ".
|
||||
"generation failed because the target directory cannot be detected.");
|
||||
}
|
||||
|
||||
$output->writeln(sprintf(' > <info>OK</info> generating <comment>%s</comment>', $metadata->customRepositoryClassName));
|
||||
$generator->writeEntityRepositoryClass($metadata->customRepositoryClassName, $this->findBasePathForBundle($foundBundle));
|
||||
} else {
|
||||
$output->writeln(sprintf(' > <error>SKIP</error> no custom repository for <comment>%s</comment>', $metadata->name));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
throw new \RuntimeException("Bundle " . $bundleName . " does not contain any mapped entities.");
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user